added benchmarks

This commit is contained in:
2026-09-14 23:09:25 +02:00
parent f1aca261ae
commit 3dde5e5acf
11 changed files with 823 additions and 18 deletions
+80
View File
@@ -0,0 +1,80 @@
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using BenchmarkDotNet.Running;
using PCRE;
using ParadoxSaveParser.Lib;
namespace ParadoxSaveParser.Benchmarks;
public static class Program
{
public static void Main(string[] args)
{
switch (args.FirstOrDefault())
{
case "prepare":
BenchData.PrepareJson();
return;
case "verify":
Verify();
return;
default:
BenchmarkSwitcher.FromTypes([typeof(ExtractionBenchmarks), typeof(JqBenchmarks), typeof(ParserInputBenchmarks)])
.Run(args);
return;
}
}
/// <summary>
/// Runs every extractor once and prints its checksum and wall time,
/// so that differences in what each engine actually finds are visible before benchmarking.
/// </summary>
private static void Verify()
{
Console.WriteLine($"save: {BenchData.PdxPath} {new FileInfo(BenchData.PdxPath).Length / 1024 / 1024} MB");
Console.WriteLine($"json: {BenchData.JsonPath} {new FileInfo(BenchData.JsonPath).Length / 1024 / 1024} MB");
var pdx = BenchData.PdxBytes;
var text = BenchData.PdxText;
var json = File.ReadAllBytes(BenchData.JsonPath);
var query = SearchExpressionCompiler.Compile(BenchData.PdxQuery);
Time("SearchExpression", () => Extractors.SearchExpression(pdx, query));
Time("FullParse", () => Extractors.FullParseThenSelect(pdx));
Time("Regex flat compiled",
() => Extractors.RegexScan(new Regex(Extractors.FlatPattern, RegexOptions.Compiled), text));
Time("Regex path aware compiled",
() => Extractors.RegexScan(new Regex(Extractors.PathAwarePattern, RegexOptions.Compiled), text));
Time("Regex path aware nonbacktracking",
() => Extractors.RegexScan(new Regex(Extractors.PathAwarePattern, RegexOptions.NonBacktracking), text));
Time("Regex balanced two stage",
() => Extractors.RegexTwoStage(new Regex(Extractors.CountriesBlockPattern, RegexOptions.Compiled),
new Regex(Extractors.FlatPattern, RegexOptions.Compiled), text));
Time("PCRE flat", () => Extractors.PcreScan(new PcreRegex(Extractors.FlatPattern, PcreOptions.Compiled), text));
Time("PCRE path aware",
() => Extractors.PcreScan(new PcreRegex(Extractors.PathAwarePattern, PcreOptions.Compiled), text));
Time("Utf8JsonReader", () => Extractors.Utf8JsonReaderScan(json));
Mispairing.Report(pdx, text);
Time("JsonDocument", () => Extractors.JsonDocumentScan(json));
}
private static void Time(string name, Func<long> f)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
long checksum;
try
{
checksum = f();
}
catch (Exception ex)
{
Console.WriteLine($"{name,-34} FAILED: {ex.Message}");
return;
}
sw.Stop();
Console.WriteLine($"{name,-34} countries={checksum / 1_000_000,5} techSum={checksum % 1_000_000,7} {sw.ElapsedMilliseconds,7} ms");
}
}