From 3b96560526079bac97f62f977aa8980ee6eff245 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 10 Nov 2026 12:42:11 +0000 Subject: [PATCH 01/11] Benchmarks of the stylesheets alone, compiled and run by XslCompiledTransform [no-new-version] Co-Authored-By: Claude Fable 5.2 Claude-Session: https://claude.ai/code/session_01Q8QQiasbLr6WtXXCEP1zrJ --- ...s.StylesheetBenchmarks-20261110-123239.log | 313 +++++++++++++ ...s.StylesheetBenchmarks-20261110-123339.log | 93 ++++ ...s.StylesheetBenchmarks-20261110-123430.log | 417 +++++++++++++++++ ...s.StylesheetBenchmarks-20261110-123556.log | 95 ++++ ...s.StylesheetBenchmarks-20261110-123647.log | 428 +++++++++++++++++ ...s.StylesheetBenchmarks-20261110-123831.log | 409 ++++++++++++++++ ...s.StylesheetBenchmarks-20261110-123928.log | 109 +++++ ...s.StylesheetBenchmarks-20261110-124017.log | 436 ++++++++++++++++++ ...arks.StylesheetBenchmarks-report-github.md | 20 + ...Benchmarks.StylesheetBenchmarks-report.csv | 7 + ...enchmarks.StylesheetBenchmarks-report.html | 37 ++ .../SharpEquations.Benchmarks/Samples.cs | 5 + .../SharpEquations.Benchmarks.csproj | 2 + .../StylesheetBenchmarks.cs | 143 ++++++ src/SharpEquations/SharpEquations.csproj | 1 + 15 files changed, 2515 insertions(+) create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123239.log create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123339.log create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123430.log create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123556.log create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123647.log create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123831.log create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123928.log create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-124017.log create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html create mode 100644 benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123239.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123239.log new file mode 100644 index 0000000..f44f207 --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123239.log @@ -0,0 +1,313 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 6 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 3.33 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 39.86 sec and exited with 0 +// ***** Done, took 00:00:43 (43.25 sec) ***** +// Found 6 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.IO.InvalidDataException: Only MTEF versions 3 and 5 are supported, not 239. + at SharpEquations.Internal.Mtef.MtefReader.ReadEquation() in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 61 + at SharpEquations.Internal.Mtef.MtefReader.Read(ReadOnlySpan`1 mtef) in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 54 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Records(Byte[] bytes) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 54 + at System.Linq.Enumerable.ArraySelectIterator`2.MoveNext() + at System.Linq.Enumerable.OfTypeIterator`1.ToArray() + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 41 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_0.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 179 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 1803 has exited with code 255. + +// ** Remained 5 (83.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:33 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathMLXslCompiledTransform --job ShortRun --benchmarkId 1 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.IO.InvalidDataException: Only MTEF versions 3 and 5 are supported, not 239. + at SharpEquations.Internal.Mtef.MtefReader.ReadEquation() in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 61 + at SharpEquations.Internal.Mtef.MtefReader.Read(ReadOnlySpan`1 mtef) in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 54 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Records(Byte[] bytes) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 54 + at System.Linq.Enumerable.ArraySelectIterator`2.MoveNext() + at System.Linq.Enumerable.OfTypeIterator`1.ToArray() + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 41 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_1.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 379 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 1813 has exited with code 255. + +// ** Remained 4 (66.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:33 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2Omml --job ShortRun --benchmarkId 2 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.IO.InvalidDataException: Only MTEF versions 3 and 5 are supported, not 239. + at SharpEquations.Internal.Mtef.MtefReader.ReadEquation() in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 61 + at SharpEquations.Internal.Mtef.MtefReader.Read(ReadOnlySpan`1 mtef) in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 54 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Records(Byte[] bytes) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 54 + at System.Linq.Enumerable.ArraySelectIterator`2.MoveNext() + at System.Linq.Enumerable.OfTypeIterator`1.ToArray() + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 41 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_2.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 579 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 1822 has exited with code 255. + +// ** Remained 3 (50.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:33 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2OmmlXslCompiledTransform --job ShortRun --benchmarkId 3 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.IO.InvalidDataException: Only MTEF versions 3 and 5 are supported, not 239. + at SharpEquations.Internal.Mtef.MtefReader.ReadEquation() in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 61 + at SharpEquations.Internal.Mtef.MtefReader.Read(ReadOnlySpan`1 mtef) in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 54 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Records(Byte[] bytes) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 54 + at System.Linq.Enumerable.ArraySelectIterator`2.MoveNext() + at System.Linq.Enumerable.OfTypeIterator`1.ToArray() + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 41 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_3.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 779 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 1831 has exited with code 255. + +// ** Remained 2 (33.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:33 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathML --job ShortRun --benchmarkId 4 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.IO.InvalidDataException: Only MTEF versions 3 and 5 are supported, not 239. + at SharpEquations.Internal.Mtef.MtefReader.ReadEquation() in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 61 + at SharpEquations.Internal.Mtef.MtefReader.Read(ReadOnlySpan`1 mtef) in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 54 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Records(Byte[] bytes) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 54 + at System.Linq.Enumerable.ArraySelectIterator`2.MoveNext() + at System.Linq.Enumerable.OfTypeIterator`1.ToArray() + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 41 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_4.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 979 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 1840 has exited with code 255. + +// ** Remained 1 (16.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:33 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform --job ShortRun --benchmarkId 5 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.IO.InvalidDataException: Only MTEF versions 3 and 5 are supported, not 239. + at SharpEquations.Internal.Mtef.MtefReader.ReadEquation() in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 61 + at SharpEquations.Internal.Mtef.MtefReader.Read(ReadOnlySpan`1 mtef) in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 54 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Records(Byte[] bytes) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 54 + at System.Linq.Enumerable.ArraySelectIterator`2.MoveNext() + at System.Linq.Enumerable.OfTypeIterator`1.ToArray() + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 41 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_5.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 1179 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 1849 has exited with code 255. + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:33 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | +|-------------------------------- |-----:|------:| +| Omml2MathML | NA | NA | +| Omml2MathMLXslCompiledTransform | NA | NA | +| MathML2Omml | NA | NA | +| MathML2OmmlXslCompiledTransform | NA | NA | +| Mtef2MathML | NA | NA | +| Mtef2MathMLXslCompiledTransform | NA | NA | + +Benchmarks with issues: + StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + 1 ns : 1 Nanosecond (0.000000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:12 (12.1 sec), executed benchmarks: 6 + +Global total time: 00:00:55 (55.47 sec), executed benchmarks: 6 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123339.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123339.log new file mode 100644 index 0000000..d0f45c8 --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123339.log @@ -0,0 +1,93 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 1 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 1.66 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 39.82 sec and exited with 0 +// ***** Done, took 00:00:41 (41.54 sec) ***** +// Found 1 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 130 131 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.IO.InvalidDataException: Only MTEF versions 3 and 5 are supported, not 239. + at SharpEquations.Internal.Mtef.MtefReader.ReadEquation() in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 61 + at SharpEquations.Internal.Mtef.MtefReader.Read(ReadOnlySpan`1 mtef) in /home/user/SharpEquations/src/SharpEquations/Internal/Mtef/MtefReader.cs:line 54 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Records(Byte[] bytes) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 54 + at System.Linq.Enumerable.ArraySelectIterator`2.MoveNext() + at System.Linq.Enumerable.OfTypeIterator`1.ToArray() + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 41 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_0.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 179 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 2134 has exited with code 255. + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:34 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | +|------------ |-----:|------:| +| Omml2MathML | NA | NA | + +Benchmarks with issues: + StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + 1 ns : 1 Nanosecond (0.000000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:02 (2.19 sec), executed benchmarks: 1 + +Global total time: 00:00:43 (43.81 sec), executed benchmarks: 1 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123430.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123430.log new file mode 100644 index 0000000..ca77eef --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123430.log @@ -0,0 +1,417 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 6 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 1.74 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 36.63 sec and exited with 0 +// ***** Done, took 00:00:38 (38.42 sec) ***** +// Found 6 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 324230.00 ns, 324.2300 us/op + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.Xml.XmlException: The result of the stylesheet has more than one document element. + at SharpEquations.Internal.Xslt.XsltOutput.Result() in /home/user/SharpEquations/src/SharpEquations/Internal/Xslt/XsltOutput.cs:line 243 + at SharpEquations.Internal.Xslt.Omml2mmlStylesheet.Transform(XElement input) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/obj/SharpEquations/release_net10.0/SharpEquations.XsltGenerator/SharpEquations.XsltGenerator.XsltGenerator/Omml2mmlStylesheet.g.cs:line 277 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 97 + at BenchmarkDotNet.Autogenerated.Runnable_0.WorkloadActionNoUnroll(Int64 invokeCount) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 316 + at BenchmarkDotNet.Engines.Engine.Measure(Action`1 action, Int64 invokeCount) + at BenchmarkDotNet.Engines.Engine.RunIteration(IterationData data) + at BenchmarkDotNet.Engines.EngineFactory.Jit(Engine engine, Int32 jitIndex, Int32 invokeCount, Int32 unrollFactor) + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_0.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 179 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 2497 has exited with code 255. + +// ** Remained 5 (83.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathMLXslCompiledTransform --job ShortRun --benchmarkId 1 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 278853.00 ns, 278.8530 us/op + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 82 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathMLXslCompiledTransform() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 102 + at BenchmarkDotNet.Autogenerated.Runnable_1.WorkloadActionNoUnroll(Int64 invokeCount) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 516 + at BenchmarkDotNet.Engines.Engine.Measure(Action`1 action, Int64 invokeCount) + at BenchmarkDotNet.Engines.Engine.RunIteration(IterationData data) + at BenchmarkDotNet.Engines.EngineFactory.Jit(Engine engine, Int32 jitIndex, Int32 invokeCount, Int32 unrollFactor) + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_1.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 379 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 2508 has exited with code 255. + +// ** Remained 4 (66.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2Omml --job ShortRun --benchmarkId 2 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 228121.00 ns, 228.1210 us/op +WorkloadJitting 1: 1 op, 502151057.00 ns, 502.1511 ms/op + +OverheadJitting 2: 1 op, 2207.00 ns, 2.2070 us/op +WorkloadJitting 2: 1 op, 329125572.00 ns, 329.1256 ms/op + +WorkloadPilot 1: 2 op, 538478309.00 ns, 269.2392 ms/op + +WorkloadWarmup 1: 2 op, 300092027.00 ns, 150.0460 ms/op +WorkloadWarmup 2: 2 op, 296125822.00 ns, 148.0629 ms/op +WorkloadWarmup 3: 2 op, 308361311.00 ns, 154.1807 ms/op + +// BeforeActualRun +WorkloadActual 1: 2 op, 312234678.00 ns, 156.1173 ms/op +WorkloadActual 2: 2 op, 274827912.00 ns, 137.4140 ms/op +WorkloadActual 3: 2 op, 283128731.00 ns, 141.5644 ms/op + +// AfterActualRun +WorkloadResult 1: 2 op, 312234678.00 ns, 156.1173 ms/op +WorkloadResult 2: 2 op, 274827912.00 ns, 137.4140 ms/op +WorkloadResult 3: 2 op, 283128731.00 ns, 141.5644 ms/op +// GC: 2 0 0 548198320 2 +// Threading: 0 0 2 + +// AfterAll +// Benchmark Process 2517 has exited with code 0. + +Mean = 145.032 ms, StdErr = 5.671 ms (3.91%), N = 3, StdDev = 9.822 ms +Min = 137.414 ms, Q1 = 139.489 ms, Median = 141.564 ms, Q3 = 148.841 ms, Max = 156.117 ms +IQR = 9.352 ms, LowerFence = 125.462 ms, UpperFence = 162.868 ms +ConfidenceInterval = [-34.158 ms; 324.222 ms] (CI 99.9%), Margin = 179.190 ms (123.55% of Mean) +Skewness = 0.31, Kurtosis = 0.67, MValue = 2 + +// ** Remained 3 (50.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2OmmlXslCompiledTransform --job ShortRun --benchmarkId 3 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 269977.00 ns, 269.9770 us/op +WorkloadJitting 1: 1 op, 332991220.00 ns, 332.9912 ms/op + +WorkloadPilot 1: 2 op, 319764888.00 ns, 159.8824 ms/op +WorkloadPilot 2: 3 op, 484474821.00 ns, 161.4916 ms/op +WorkloadPilot 3: 4 op, 300929875.00 ns, 75.2325 ms/op +WorkloadPilot 4: 5 op, 331285518.00 ns, 66.2571 ms/op +WorkloadPilot 5: 6 op, 378368321.00 ns, 63.0614 ms/op +WorkloadPilot 6: 7 op, 446917974.00 ns, 63.8454 ms/op +WorkloadPilot 7: 8 op, 520374697.00 ns, 65.0468 ms/op + +WorkloadWarmup 1: 8 op, 522617170.00 ns, 65.3271 ms/op +WorkloadWarmup 2: 8 op, 517377721.00 ns, 64.6722 ms/op +WorkloadWarmup 3: 8 op, 512666910.00 ns, 64.0834 ms/op + +// BeforeActualRun +WorkloadActual 1: 8 op, 517009956.00 ns, 64.6262 ms/op +WorkloadActual 2: 8 op, 534952931.00 ns, 66.8691 ms/op +WorkloadActual 3: 8 op, 600502563.00 ns, 75.0628 ms/op + +// AfterActualRun +WorkloadResult 1: 8 op, 517009956.00 ns, 64.6262 ms/op +WorkloadResult 2: 8 op, 534952931.00 ns, 66.8691 ms/op +WorkloadResult 3: 8 op, 600502563.00 ns, 75.0628 ms/op +// GC: 4 0 0 1143785472 8 +// Threading: 0 0 8 + +// AfterAll +// Benchmark Process 2527 has exited with code 0. + +Mean = 68.853 ms, StdErr = 3.172 ms (4.61%), N = 3, StdDev = 5.494 ms +Min = 64.626 ms, Q1 = 65.748 ms, Median = 66.869 ms, Q3 = 70.966 ms, Max = 75.063 ms +IQR = 5.218 ms, LowerFence = 57.920 ms, UpperFence = 78.793 ms +ConfidenceInterval = [-31.374 ms; 169.080 ms] (CI 99.9%), Margin = 100.227 ms (145.57% of Mean) +Skewness = 0.31, Kurtosis = 0.67, MValue = 2 + +// ** Remained 2 (33.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathML --job ShortRun --benchmarkId 4 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 254453.00 ns, 254.4530 us/op +WorkloadJitting 1: 1 op, 209615565.00 ns, 209.6156 ms/op + +WorkloadPilot 1: 2 op, 261342859.00 ns, 130.6714 ms/op +WorkloadPilot 2: 3 op, 202035384.00 ns, 67.3451 ms/op +WorkloadPilot 3: 4 op, 257406699.00 ns, 64.3517 ms/op +WorkloadPilot 4: 5 op, 294636404.00 ns, 58.9273 ms/op +WorkloadPilot 5: 6 op, 371869586.00 ns, 61.9783 ms/op +WorkloadPilot 6: 7 op, 498314231.00 ns, 71.1877 ms/op +WorkloadPilot 7: 8 op, 588852301.00 ns, 73.6065 ms/op + +WorkloadWarmup 1: 8 op, 616080619.00 ns, 77.0101 ms/op +WorkloadWarmup 2: 8 op, 764333578.00 ns, 95.5417 ms/op +WorkloadWarmup 3: 8 op, 893733741.00 ns, 111.7167 ms/op + +// BeforeActualRun +WorkloadActual 1: 8 op, 827983294.00 ns, 103.4979 ms/op +WorkloadActual 2: 8 op, 902690496.00 ns, 112.8363 ms/op +WorkloadActual 3: 8 op, 997015368.00 ns, 124.6269 ms/op + +// AfterActualRun +WorkloadResult 1: 8 op, 827983294.00 ns, 103.4979 ms/op +WorkloadResult 2: 8 op, 902690496.00 ns, 112.8363 ms/op +WorkloadResult 3: 8 op, 997015368.00 ns, 124.6269 ms/op +// GC: 2 0 0 670370584 8 +// Threading: 0 0 8 + +// AfterAll +// Benchmark Process 2542 has exited with code 0. + +Mean = 113.654 ms, StdErr = 6.113 ms (5.38%), N = 3, StdDev = 10.588 ms +Min = 103.498 ms, Q1 = 108.167 ms, Median = 112.836 ms, Q3 = 118.732 ms, Max = 124.627 ms +IQR = 10.565 ms, LowerFence = 92.320 ms, UpperFence = 134.578 ms +ConfidenceInterval = [-79.514 ms; 306.822 ms] (CI 99.9%), Margin = 193.168 ms (169.96% of Mean) +Skewness = 0.08, Kurtosis = 0.67, MValue = 2 + +// ** Remained 1 (16.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform --job ShortRun --benchmarkId 5 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 299498.00 ns, 299.4980 us/op +WorkloadJitting 1: 1 op, 828490135.00 ns, 828.4901 ms/op + +OverheadJitting 2: 1 op, 2540.00 ns, 2.5400 us/op +WorkloadJitting 2: 1 op, 68308158.00 ns, 68.3082 ms/op + +WorkloadPilot 1: 2 op, 132438738.00 ns, 66.2194 ms/op +WorkloadPilot 2: 3 op, 205241567.00 ns, 68.4139 ms/op +WorkloadPilot 3: 4 op, 313484291.00 ns, 78.3711 ms/op +WorkloadPilot 4: 5 op, 528388345.00 ns, 105.6777 ms/op + +WorkloadWarmup 1: 5 op, 460712498.00 ns, 92.1425 ms/op +WorkloadWarmup 2: 5 op, 259488686.00 ns, 51.8977 ms/op +WorkloadWarmup 3: 5 op, 186627502.00 ns, 37.3255 ms/op + +// BeforeActualRun +WorkloadActual 1: 5 op, 203476646.00 ns, 40.6953 ms/op +WorkloadActual 2: 5 op, 190199501.00 ns, 38.0399 ms/op +WorkloadActual 3: 5 op, 188409515.00 ns, 37.6819 ms/op + +// AfterActualRun +WorkloadResult 1: 5 op, 203476646.00 ns, 40.6953 ms/op +WorkloadResult 2: 5 op, 190199501.00 ns, 38.0399 ms/op +WorkloadResult 3: 5 op, 188409515.00 ns, 37.6819 ms/op +// GC: 0 0 0 109502120 5 +// Threading: 0 0 5 + +// AfterAll +// Benchmark Process 2553 has exited with code 0. + +Mean = 38.806 ms, StdErr = 0.950 ms (2.45%), N = 3, StdDev = 1.646 ms +Min = 37.682 ms, Q1 = 37.861 ms, Median = 38.040 ms, Q3 = 39.368 ms, Max = 40.695 ms +IQR = 1.507 ms, LowerFence = 35.601 ms, UpperFence = 41.628 ms +ConfidenceInterval = [8.773 ms; 68.839 ms] (CI 99.9%), Margin = 30.033 ms (77.39% of Mean) +Skewness = 0.36, Kurtosis = 0.67, MValue = 2 + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:35 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 145.032 ms, StdErr = 5.671 ms (3.91%), N = 3, StdDev = 9.822 ms +Min = 137.414 ms, Q1 = 139.489 ms, Median = 141.564 ms, Q3 = 148.841 ms, Max = 156.117 ms +IQR = 9.352 ms, LowerFence = 125.462 ms, UpperFence = 162.868 ms +ConfidenceInterval = [-34.158 ms; 324.222 ms] (CI 99.9%), Margin = 179.190 ms (123.55% of Mean) +Skewness = 0.31, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[130.551 ms ; 148.428 ms) | @@ +[148.428 ms ; 165.056 ms) | @ +--------------------------------------------------- + +StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 68.853 ms, StdErr = 3.172 ms (4.61%), N = 3, StdDev = 5.494 ms +Min = 64.626 ms, Q1 = 65.748 ms, Median = 66.869 ms, Q3 = 70.966 ms, Max = 75.063 ms +IQR = 5.218 ms, LowerFence = 57.920 ms, UpperFence = 78.793 ms +ConfidenceInterval = [-31.374 ms; 169.080 ms] (CI 99.9%), Margin = 100.227 ms (145.57% of Mean) +Skewness = 0.31, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[60.748 ms ; 70.747 ms) | @@ +[70.747 ms ; 80.062 ms) | @ +--------------------------------------------------- + +StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 113.654 ms, StdErr = 6.113 ms (5.38%), N = 3, StdDev = 10.588 ms +Min = 103.498 ms, Q1 = 108.167 ms, Median = 112.836 ms, Q3 = 118.732 ms, Max = 124.627 ms +IQR = 10.565 ms, LowerFence = 92.320 ms, UpperFence = 134.578 ms +ConfidenceInterval = [-79.514 ms; 306.822 ms] (CI 99.9%), Margin = 193.168 ms (169.96% of Mean) +Skewness = 0.08, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[ 98.531 ms ; 117.803 ms) | @@ +[117.803 ms ; 134.263 ms) | @ +--------------------------------------------------- + +StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 38.806 ms, StdErr = 0.950 ms (2.45%), N = 3, StdDev = 1.646 ms +Min = 37.682 ms, Q1 = 37.861 ms, Median = 38.040 ms, Q3 = 39.368 ms, Max = 40.695 ms +IQR = 1.507 ms, LowerFence = 35.601 ms, UpperFence = 41.628 ms +ConfidenceInterval = [8.773 ms; 68.839 ms] (CI 99.9%), Margin = 30.033 ms (77.39% of Mean) +Skewness = 0.36, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[36.184 ms ; 39.359 ms) | @@ +[39.359 ms ; 42.193 ms) | @ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|-------------------------------- |----------:|----------:|----------:|----------:|----------:| +| Omml2MathML | NA | NA | NA | NA | NA | +| Omml2MathMLXslCompiledTransform | NA | NA | NA | NA | NA | +| MathML2Omml | 145.03 ms | 179.19 ms | 9.822 ms | 1000.0000 | 261.4 MB | +| MathML2OmmlXslCompiledTransform | 68.85 ms | 100.23 ms | 5.494 ms | 500.0000 | 136.35 MB | +| Mtef2MathML | 113.65 ms | 193.17 ms | 10.588 ms | 250.0000 | 79.91 MB | +| Mtef2MathMLXslCompiledTransform | 38.81 ms | 30.03 ms | 1.646 ms | - | 20.89 MB | + +Benchmarks with issues: + StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + StdDev : Standard deviation of all measurements + Gen0 : GC Generation 0 collects per 1000 operations + Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) + 1 ms : 1 Millisecond (0.001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:42 (42.65 sec), executed benchmarks: 6 + +Global total time: 00:01:21 (81.18 sec), executed benchmarks: 6 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123556.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123556.log new file mode 100644 index 0000000..f36ed63 --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123556.log @@ -0,0 +1,95 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 1 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 2.25 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 37.65 sec and exited with 0 +// ***** Done, took 00:00:39 (39.97 sec) ***** +// Found 1 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 130 131 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 222045.00 ns, 222.0450 us/op + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.Xml.XmlException: The result of the stylesheet has more than one document element. + at SharpEquations.Internal.Xslt.XsltOutput.Result() in /home/user/SharpEquations/src/SharpEquations/Internal/Xslt/XsltOutput.cs:line 243 + at SharpEquations.Internal.Xslt.Omml2mmlStylesheet.Transform(XElement input) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/obj/SharpEquations/release_net10.0/SharpEquations.XsltGenerator/SharpEquations.XsltGenerator.XsltGenerator/Omml2mmlStylesheet.g.cs:line 277 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 97 + at BenchmarkDotNet.Autogenerated.Runnable_0.WorkloadActionNoUnroll(Int64 invokeCount) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 316 + at BenchmarkDotNet.Engines.Engine.Measure(Action`1 action, Int64 invokeCount) + at BenchmarkDotNet.Engines.Engine.RunIteration(IterationData data) + at BenchmarkDotNet.Engines.EngineFactory.Jit(Engine engine, Int32 jitIndex, Int32 invokeCount, Int32 unrollFactor) + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_0.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 179 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 2839 has exited with code 255. + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:36 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | +|------------ |-----:|------:| +| Omml2MathML | NA | NA | + +Benchmarks with issues: + StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + 1 ns : 1 Nanosecond (0.000000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:02 (2.88 sec), executed benchmarks: 1 + +Global total time: 00:00:42 (42.95 sec), executed benchmarks: 1 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123647.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123647.log new file mode 100644 index 0000000..1ac7a22 --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123647.log @@ -0,0 +1,428 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 6 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 1.78 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 37.5 sec and exited with 0 +// ***** Done, took 00:00:39 (39.33 sec) ***** +// Found 6 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 194709.00 ns, 194.7090 us/op +WorkloadJitting 1: 1 op, 266462747.00 ns, 266.4627 ms/op + +WorkloadPilot 1: 2 op, 401325155.00 ns, 200.6626 ms/op +WorkloadPilot 2: 3 op, 591680238.00 ns, 197.2267 ms/op + +WorkloadWarmup 1: 3 op, 586954343.00 ns, 195.6514 ms/op +WorkloadWarmup 2: 3 op, 573246867.00 ns, 191.0823 ms/op +WorkloadWarmup 3: 3 op, 599193355.00 ns, 199.7311 ms/op + +// BeforeActualRun +WorkloadActual 1: 3 op, 586179681.00 ns, 195.3932 ms/op +WorkloadActual 2: 3 op, 673804704.00 ns, 224.6016 ms/op +WorkloadActual 3: 3 op, 646470296.00 ns, 215.4901 ms/op + +// AfterActualRun +WorkloadResult 1: 3 op, 586179681.00 ns, 195.3932 ms/op +WorkloadResult 2: 3 op, 673804704.00 ns, 224.6016 ms/op +WorkloadResult 3: 3 op, 646470296.00 ns, 215.4901 ms/op +// GC: 5 0 0 1456083936 3 +// Threading: 0 0 3 + +// AfterAll +// Benchmark Process 3199 has exited with code 0. + +Mean = 211.828 ms, StdErr = 8.628 ms (4.07%), N = 3, StdDev = 14.945 ms +Min = 195.393 ms, Q1 = 205.442 ms, Median = 215.490 ms, Q3 = 220.046 ms, Max = 224.602 ms +IQR = 14.604 ms, LowerFence = 183.535 ms, UpperFence = 241.952 ms +ConfidenceInterval = [-60.815 ms; 484.472 ms] (CI 99.9%), Margin = 272.643 ms (128.71% of Mean) +Skewness = -0.23, Kurtosis = 0.67, MValue = 2 + +// ** Remained 5 (83.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:38 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathMLXslCompiledTransform --job ShortRun --benchmarkId 1 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 322762.00 ns, 322.7620 us/op + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 96 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathMLXslCompiledTransform() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 116 + at BenchmarkDotNet.Autogenerated.Runnable_1.WorkloadActionNoUnroll(Int64 invokeCount) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 516 + at BenchmarkDotNet.Engines.Engine.Measure(Action`1 action, Int64 invokeCount) + at BenchmarkDotNet.Engines.Engine.RunIteration(IterationData data) + at BenchmarkDotNet.Engines.EngineFactory.Jit(Engine engine, Int32 jitIndex, Int32 invokeCount, Int32 unrollFactor) + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_1.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 379 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 3210 has exited with code 255. + +// ** Remained 4 (66.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:38 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2Omml --job ShortRun --benchmarkId 2 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 262215.00 ns, 262.2150 us/op +WorkloadJitting 1: 1 op, 319985923.00 ns, 319.9859 ms/op + +WorkloadPilot 1: 2 op, 351178752.00 ns, 175.5894 ms/op +WorkloadPilot 2: 3 op, 471418466.00 ns, 157.1395 ms/op +WorkloadPilot 3: 4 op, 578537142.00 ns, 144.6343 ms/op + +WorkloadWarmup 1: 4 op, 601098367.00 ns, 150.2746 ms/op +WorkloadWarmup 2: 4 op, 592316795.00 ns, 148.0792 ms/op +WorkloadWarmup 3: 4 op, 557495450.00 ns, 139.3739 ms/op + +// BeforeActualRun +WorkloadActual 1: 4 op, 552142982.00 ns, 138.0357 ms/op +WorkloadActual 2: 4 op, 570841778.00 ns, 142.7104 ms/op +WorkloadActual 3: 4 op, 574658754.00 ns, 143.6647 ms/op + +// AfterActualRun +WorkloadResult 1: 4 op, 552142982.00 ns, 138.0357 ms/op +WorkloadResult 2: 4 op, 570841778.00 ns, 142.7104 ms/op +WorkloadResult 3: 4 op, 574658754.00 ns, 143.6647 ms/op +// GC: 4 0 0 1093890912 4 +// Threading: 0 0 4 + +// AfterAll +// Benchmark Process 3219 has exited with code 0. + +Mean = 141.470 ms, StdErr = 1.739 ms (1.23%), N = 3, StdDev = 3.012 ms +Min = 138.036 ms, Q1 = 140.373 ms, Median = 142.710 ms, Q3 = 143.188 ms, Max = 143.665 ms +IQR = 2.814 ms, LowerFence = 136.151 ms, UpperFence = 147.409 ms +ConfidenceInterval = [86.512 ms; 196.428 ms] (CI 99.9%), Margin = 54.958 ms (38.85% of Mean) +Skewness = -0.34, Kurtosis = 0.67, MValue = 2 + +// ** Remained 3 (50.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:38 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2OmmlXslCompiledTransform --job ShortRun --benchmarkId 3 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 205795.00 ns, 205.7950 us/op +WorkloadJitting 1: 1 op, 348648465.00 ns, 348.6485 ms/op + +OverheadJitting 2: 1 op, 1168.00 ns, 1.1680 us/op +WorkloadJitting 2: 1 op, 133525676.00 ns, 133.5257 ms/op + +WorkloadPilot 1: 2 op, 279863332.00 ns, 139.9317 ms/op +WorkloadPilot 2: 3 op, 333443750.00 ns, 111.1479 ms/op +WorkloadPilot 3: 4 op, 495661776.00 ns, 123.9154 ms/op +WorkloadPilot 4: 5 op, 617376962.00 ns, 123.4754 ms/op + +WorkloadWarmup 1: 5 op, 337648598.00 ns, 67.5297 ms/op +WorkloadWarmup 2: 5 op, 316457340.00 ns, 63.2915 ms/op +WorkloadWarmup 3: 5 op, 317262041.00 ns, 63.4524 ms/op + +// BeforeActualRun +WorkloadActual 1: 5 op, 315277883.00 ns, 63.0556 ms/op +WorkloadActual 2: 5 op, 316256234.00 ns, 63.2512 ms/op +WorkloadActual 3: 5 op, 315740654.00 ns, 63.1481 ms/op + +// AfterActualRun +WorkloadResult 1: 5 op, 315277883.00 ns, 63.0556 ms/op +WorkloadResult 2: 5 op, 316256234.00 ns, 63.2512 ms/op +WorkloadResult 3: 5 op, 315740654.00 ns, 63.1481 ms/op +// GC: 2 0 0 714670480 5 +// Threading: 0 0 5 + +// AfterAll +// Benchmark Process 3231 has exited with code 0. + +Mean = 63.152 ms, StdErr = 0.057 ms (0.09%), N = 3, StdDev = 0.098 ms +Min = 63.056 ms, Q1 = 63.102 ms, Median = 63.148 ms, Q3 = 63.200 ms, Max = 63.251 ms +IQR = 0.098 ms, LowerFence = 62.955 ms, UpperFence = 63.346 ms +ConfidenceInterval = [61.366 ms; 64.937 ms] (CI 99.9%), Margin = 1.786 ms (2.83% of Mean) +Skewness = 0.04, Kurtosis = 0.67, MValue = 2 + +// ** Remained 2 (33.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:38 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathML --job ShortRun --benchmarkId 4 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 207747.00 ns, 207.7470 us/op +WorkloadJitting 1: 1 op, 87747541.00 ns, 87.7475 ms/op + +WorkloadPilot 1: 2 op, 184922887.00 ns, 92.4614 ms/op +WorkloadPilot 2: 3 op, 222526350.00 ns, 74.1755 ms/op +WorkloadPilot 3: 4 op, 256862867.00 ns, 64.2157 ms/op +WorkloadPilot 4: 5 op, 292054214.00 ns, 58.4108 ms/op +WorkloadPilot 5: 6 op, 372788961.00 ns, 62.1315 ms/op +WorkloadPilot 6: 7 op, 462412544.00 ns, 66.0589 ms/op +WorkloadPilot 7: 8 op, 609156189.00 ns, 76.1445 ms/op + +WorkloadWarmup 1: 8 op, 692005310.00 ns, 86.5007 ms/op +WorkloadWarmup 2: 8 op, 815700589.00 ns, 101.9626 ms/op +WorkloadWarmup 3: 8 op, 804681435.00 ns, 100.5852 ms/op + +// BeforeActualRun +WorkloadActual 1: 8 op, 924518779.00 ns, 115.5648 ms/op +WorkloadActual 2: 8 op, 839163680.00 ns, 104.8955 ms/op +WorkloadActual 3: 8 op, 839146877.00 ns, 104.8934 ms/op + +// AfterActualRun +WorkloadResult 1: 8 op, 924518779.00 ns, 115.5648 ms/op +WorkloadResult 2: 8 op, 839163680.00 ns, 104.8955 ms/op +WorkloadResult 3: 8 op, 839146877.00 ns, 104.8934 ms/op +// GC: 2 0 0 670347120 8 +// Threading: 0 0 8 + +// AfterAll +// Benchmark Process 3244 has exited with code 0. + +Mean = 108.451 ms, StdErr = 3.557 ms (3.28%), N = 3, StdDev = 6.161 ms +Min = 104.893 ms, Q1 = 104.894 ms, Median = 104.895 ms, Q3 = 110.230 ms, Max = 115.565 ms +IQR = 5.336 ms, LowerFence = 96.891 ms, UpperFence = 118.234 ms +ConfidenceInterval = [-3.941 ms; 220.843 ms] (CI 99.9%), Margin = 112.392 ms (103.63% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 + +// ** Remained 1 (16.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:38 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform --job ShortRun --benchmarkId 5 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 332498.00 ns, 332.4980 us/op +WorkloadJitting 1: 1 op, 828588169.00 ns, 828.5882 ms/op + +OverheadJitting 2: 1 op, 2634.00 ns, 2.6340 us/op +WorkloadJitting 2: 1 op, 53261954.00 ns, 53.2620 ms/op + +WorkloadPilot 1: 2 op, 101844993.00 ns, 50.9225 ms/op +WorkloadPilot 2: 3 op, 170751731.00 ns, 56.9172 ms/op +WorkloadPilot 3: 4 op, 212361859.00 ns, 53.0905 ms/op +WorkloadPilot 4: 5 op, 351681991.00 ns, 70.3364 ms/op +WorkloadPilot 5: 6 op, 575096476.00 ns, 95.8494 ms/op + +WorkloadWarmup 1: 6 op, 427206441.00 ns, 71.2011 ms/op +WorkloadWarmup 2: 6 op, 236115447.00 ns, 39.3526 ms/op +WorkloadWarmup 3: 6 op, 219088770.00 ns, 36.5148 ms/op + +// BeforeActualRun +WorkloadActual 1: 6 op, 220674346.00 ns, 36.7791 ms/op +WorkloadActual 2: 6 op, 205170294.00 ns, 34.1950 ms/op +WorkloadActual 3: 6 op, 206221806.00 ns, 34.3703 ms/op + +// AfterActualRun +WorkloadResult 1: 6 op, 220674346.00 ns, 36.7791 ms/op +WorkloadResult 2: 6 op, 205170294.00 ns, 34.1950 ms/op +WorkloadResult 3: 6 op, 206221806.00 ns, 34.3703 ms/op +// GC: 0 0 0 131402544 6 +// Threading: 0 0 6 + +// AfterAll +// Benchmark Process 3256 has exited with code 0. + +Mean = 35.115 ms, StdErr = 0.834 ms (2.37%), N = 3, StdDev = 1.444 ms +Min = 34.195 ms, Q1 = 34.283 ms, Median = 34.370 ms, Q3 = 35.575 ms, Max = 36.779 ms +IQR = 1.292 ms, LowerFence = 32.345 ms, UpperFence = 37.513 ms +ConfidenceInterval = [8.772 ms; 61.458 ms] (CI 99.9%), Margin = 26.343 ms (75.02% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:38 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 211.828 ms, StdErr = 8.628 ms (4.07%), N = 3, StdDev = 14.945 ms +Min = 195.393 ms, Q1 = 205.442 ms, Median = 215.490 ms, Q3 = 220.046 ms, Max = 224.602 ms +IQR = 14.604 ms, LowerFence = 183.535 ms, UpperFence = 241.952 ms +ConfidenceInterval = [-60.815 ms; 484.472 ms] (CI 99.9%), Margin = 272.643 ms (128.71% of Mean) +Skewness = -0.23, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[181.793 ms ; 206.446 ms) | @ +[206.446 ms ; 238.202 ms) | @@ +--------------------------------------------------- + +StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 141.470 ms, StdErr = 1.739 ms (1.23%), N = 3, StdDev = 3.012 ms +Min = 138.036 ms, Q1 = 140.373 ms, Median = 142.710 ms, Q3 = 143.188 ms, Max = 143.665 ms +IQR = 2.814 ms, LowerFence = 136.151 ms, UpperFence = 147.409 ms +ConfidenceInterval = [86.512 ms; 196.428 ms] (CI 99.9%), Margin = 54.958 ms (38.85% of Mean) +Skewness = -0.34, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[135.294 ms ; 140.446 ms) | @ +[140.446 ms ; 146.406 ms) | @@ +--------------------------------------------------- + +StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 63.152 ms, StdErr = 0.057 ms (0.09%), N = 3, StdDev = 0.098 ms +Min = 63.056 ms, Q1 = 63.102 ms, Median = 63.148 ms, Q3 = 63.200 ms, Max = 63.251 ms +IQR = 0.098 ms, LowerFence = 62.955 ms, UpperFence = 63.346 ms +ConfidenceInterval = [61.366 ms; 64.937 ms] (CI 99.9%), Margin = 1.786 ms (2.83% of Mean) +Skewness = 0.04, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[62.966 ms ; 63.340 ms) | @@@ +--------------------------------------------------- + +StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 108.451 ms, StdErr = 3.557 ms (3.28%), N = 3, StdDev = 6.161 ms +Min = 104.893 ms, Q1 = 104.894 ms, Median = 104.895 ms, Q3 = 110.230 ms, Max = 115.565 ms +IQR = 5.336 ms, LowerFence = 96.891 ms, UpperFence = 118.234 ms +ConfidenceInterval = [-3.941 ms; 220.843 ms] (CI 99.9%), Margin = 112.392 ms (103.63% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[104.623 ms ; 115.835 ms) | @@@ +--------------------------------------------------- + +StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 35.115 ms, StdErr = 0.834 ms (2.37%), N = 3, StdDev = 1.444 ms +Min = 34.195 ms, Q1 = 34.283 ms, Median = 34.370 ms, Q3 = 35.575 ms, Max = 36.779 ms +IQR = 1.292 ms, LowerFence = 32.345 ms, UpperFence = 37.513 ms +ConfidenceInterval = [8.772 ms; 61.458 ms] (CI 99.9%), Margin = 26.343 ms (75.02% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[34.173 ms ; 36.801 ms) | @@@ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|-------------------------------- |----------:|-----------:|----------:|----------:|----------:| +| Omml2MathML | 211.83 ms | 272.643 ms | 14.945 ms | 1666.6667 | 462.88 MB | +| Omml2MathMLXslCompiledTransform | NA | NA | NA | NA | NA | +| MathML2Omml | 141.47 ms | 54.958 ms | 3.012 ms | 1000.0000 | 260.8 MB | +| MathML2OmmlXslCompiledTransform | 63.15 ms | 1.786 ms | 0.098 ms | 400.0000 | 136.31 MB | +| Mtef2MathML | 108.45 ms | 112.392 ms | 6.161 ms | 250.0000 | 79.91 MB | +| Mtef2MathMLXslCompiledTransform | 35.11 ms | 26.343 ms | 1.444 ms | - | 20.89 MB | + +Benchmarks with issues: + StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + StdDev : Standard deviation of all measurements + Gen0 : GC Generation 0 collects per 1000 operations + Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) + 1 ms : 1 Millisecond (0.001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:53 (53.85 sec), executed benchmarks: 6 + +Global total time: 00:01:33 (93.28 sec), executed benchmarks: 6 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123831.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123831.log new file mode 100644 index 0000000..e88f601 --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123831.log @@ -0,0 +1,409 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 6 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 1.78 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 35.78 sec and exited with 0 +// ***** Done, took 00:00:37 (37.62 sec) ***** +// Found 6 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 96 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Converts(XslCompiledTransform stylesheet, XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 53 + at SharpEquations.Benchmarks.StylesheetBenchmarks.b__6_5(XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at System.Linq.Enumerable.ArrayWhereIterator`1.ToArray(ReadOnlySpan`1 source, Func`2 predicate) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_0.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 179 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 3619 has exited with code 255. + +// ** Remained 5 (83.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:39 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathMLXslCompiledTransform --job ShortRun --benchmarkId 1 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 96 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Converts(XslCompiledTransform stylesheet, XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 53 + at SharpEquations.Benchmarks.StylesheetBenchmarks.b__6_5(XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at System.Linq.Enumerable.ArrayWhereIterator`1.ToArray(ReadOnlySpan`1 source, Func`2 predicate) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_1.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 379 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 3629 has exited with code 255. + +// ** Remained 4 (66.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:39 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2Omml --job ShortRun --benchmarkId 2 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 96 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Converts(XslCompiledTransform stylesheet, XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 53 + at SharpEquations.Benchmarks.StylesheetBenchmarks.b__6_5(XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at System.Linq.Enumerable.ArrayWhereIterator`1.ToArray(ReadOnlySpan`1 source, Func`2 predicate) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_2.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 579 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 3638 has exited with code 255. + +// ** Remained 3 (50.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:39 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2OmmlXslCompiledTransform --job ShortRun --benchmarkId 3 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 96 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Converts(XslCompiledTransform stylesheet, XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 53 + at SharpEquations.Benchmarks.StylesheetBenchmarks.b__6_5(XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at System.Linq.Enumerable.ArrayWhereIterator`1.ToArray(ReadOnlySpan`1 source, Func`2 predicate) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_3.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 779 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 3648 has exited with code 255. + +// ** Remained 2 (33.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:39 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathML --job ShortRun --benchmarkId 4 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 96 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Converts(XslCompiledTransform stylesheet, XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 53 + at SharpEquations.Benchmarks.StylesheetBenchmarks.b__6_5(XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at System.Linq.Enumerable.ArrayWhereIterator`1.ToArray(ReadOnlySpan`1 source, Func`2 predicate) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_4.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 979 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 3657 has exited with code 255. + +// ** Remained 1 (16.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:39 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 137 138 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform --job ShortRun --benchmarkId 5 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 96 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Converts(XslCompiledTransform stylesheet, XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 53 + at SharpEquations.Benchmarks.StylesheetBenchmarks.b__6_5(XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at System.Linq.Enumerable.ArrayWhereIterator`1.ToArray(ReadOnlySpan`1 source, Func`2 predicate) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_5.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 1179 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 3669 has exited with code 255. + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:39 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | +|-------------------------------- |-----:|------:| +| Omml2MathML | NA | NA | +| Omml2MathMLXslCompiledTransform | NA | NA | +| MathML2Omml | NA | NA | +| MathML2OmmlXslCompiledTransform | NA | NA | +| Mtef2MathML | NA | NA | +| Mtef2MathMLXslCompiledTransform | NA | NA | + +Benchmarks with issues: + StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + 1 ns : 1 Nanosecond (0.000000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:15 (15.69 sec), executed benchmarks: 6 + +Global total time: 00:00:53 (53.39 sec), executed benchmarks: 6 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123928.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123928.log new file mode 100644 index 0000000..468ba3c --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-123928.log @@ -0,0 +1,109 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 1 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 1.74 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 37.25 sec and exited with 0 +// ***** Done, took 00:00:39 (39.04 sec) ***** +// Found 1 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 130 131 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> System.ArgumentException: The surrogate pair is invalid. Missing a low surrogate character. + at System.Xml.XmlEncodedRawTextWriter.EncodeSurrogate(Char* pSrc, Char* pSrcEnd, Char* pDst) + at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) + at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) + at System.Xml.Xsl.Runtime.XmlQueryOutput.WriteString(String text, Boolean disableOutputEscaping) + at (XmlQueryRuntime, XPathNavigator, IList`1, IList`1, IList`1, IList`1) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at (XmlQueryRuntime, XPathNavigator) + at Root(XmlQueryRuntime) + at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer) + at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, XsltArgumentList arguments, TextWriter results) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Run(XslCompiledTransform stylesheet, XElement[] inputs) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 96 + at SharpEquations.Benchmarks.StylesheetBenchmarks.Converts(XslCompiledTransform stylesheet, XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 53 + at SharpEquations.Benchmarks.StylesheetBenchmarks.b__6_5(XElement oMath) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at System.Linq.Enumerable.ArrayWhereIterator`1.ToArray(ReadOnlySpan`1 source, Func`2 predicate) + at SharpEquations.Benchmarks.StylesheetBenchmarks.Setup() in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs:line 43 + at BenchmarkDotNet.Engines.EngineFactory.CreateReadyToRun(EngineParameters engineParameters) + at BenchmarkDotNet.Autogenerated.Runnable_0.Run(IHost host, String benchmarkName) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 179 + at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + --- End of inner exception stack trace --- + at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) + at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) + at BenchmarkDotNet.Autogenerated.UniqueProgramName.AfterAssemblyLoadingAttached(String[] args) in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/SharpEquations.Benchmarks-ShortRun-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 3948 has exited with code 255. + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:40 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +There are not any results runs + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | +|------------ |-----:|------:| +| Omml2MathML | NA | NA | + +Benchmarks with issues: + StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + 1 ns : 1 Nanosecond (0.000000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:03 (3.24 sec), executed benchmarks: 1 + +Global total time: 00:00:42 (42.38 sec), executed benchmarks: 1 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-124017.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-124017.log new file mode 100644 index 0000000..2f84ede --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-124017.log @@ -0,0 +1,436 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 6 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 1.83 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 37.27 sec and exited with 0 +// ***** Done, took 00:00:39 (39.16 sec) ***** +// Found 6 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 292054.00 ns, 292.0540 us/op +WorkloadJitting 1: 1 op, 231231522.00 ns, 231.2315 ms/op + +WorkloadPilot 1: 2 op, 455599533.00 ns, 227.7998 ms/op +WorkloadPilot 2: 3 op, 695063096.00 ns, 231.6877 ms/op + +WorkloadWarmup 1: 3 op, 621705966.00 ns, 207.2353 ms/op +WorkloadWarmup 2: 3 op, 556036705.00 ns, 185.3456 ms/op +WorkloadWarmup 3: 3 op, 555496024.00 ns, 185.1653 ms/op + +// BeforeActualRun +WorkloadActual 1: 3 op, 558002451.00 ns, 186.0008 ms/op +WorkloadActual 2: 3 op, 623287962.00 ns, 207.7627 ms/op +WorkloadActual 3: 3 op, 674103043.00 ns, 224.7010 ms/op + +// AfterActualRun +WorkloadResult 1: 3 op, 558002451.00 ns, 186.0008 ms/op +WorkloadResult 2: 3 op, 623287962.00 ns, 207.7627 ms/op +WorkloadResult 3: 3 op, 674103043.00 ns, 224.7010 ms/op +// GC: 5 0 0 1451610648 3 +// Threading: 0 0 3 + +// AfterAll +// Benchmark Process 4317 has exited with code 0. + +Mean = 206.155 ms, StdErr = 11.201 ms (5.43%), N = 3, StdDev = 19.400 ms +Min = 186.001 ms, Q1 = 196.882 ms, Median = 207.763 ms, Q3 = 216.232 ms, Max = 224.701 ms +IQR = 19.350 ms, LowerFence = 167.857 ms, UpperFence = 245.257 ms +ConfidenceInterval = [-147.776 ms; 560.085 ms] (CI 99.9%), Margin = 353.931 ms (171.68% of Mean) +Skewness = -0.08, Kurtosis = 0.67, MValue = 2 + +// ** Remained 5 (83.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:41 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathMLXslCompiledTransform --job ShortRun --benchmarkId 1 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 220122.00 ns, 220.1220 us/op +WorkloadJitting 1: 1 op, 190172543.00 ns, 190.1725 ms/op + +WorkloadPilot 1: 2 op, 328405869.00 ns, 164.2029 ms/op +WorkloadPilot 2: 3 op, 256877052.00 ns, 85.6257 ms/op +WorkloadPilot 3: 4 op, 368455554.00 ns, 92.1139 ms/op +WorkloadPilot 4: 5 op, 430513027.00 ns, 86.1026 ms/op +WorkloadPilot 5: 6 op, 486881107.00 ns, 81.1469 ms/op +WorkloadPilot 6: 7 op, 441889534.00 ns, 63.1271 ms/op +WorkloadPilot 7: 8 op, 512115907.00 ns, 64.0145 ms/op + +WorkloadWarmup 1: 8 op, 504718724.00 ns, 63.0898 ms/op +WorkloadWarmup 2: 8 op, 512098176.00 ns, 64.0123 ms/op +WorkloadWarmup 3: 8 op, 520952182.00 ns, 65.1190 ms/op + +// BeforeActualRun +WorkloadActual 1: 8 op, 512111776.00 ns, 64.0140 ms/op +WorkloadActual 2: 8 op, 507543132.00 ns, 63.4429 ms/op +WorkloadActual 3: 8 op, 547562612.00 ns, 68.4453 ms/op + +// AfterActualRun +WorkloadResult 1: 8 op, 512111776.00 ns, 64.0140 ms/op +WorkloadResult 2: 8 op, 507543132.00 ns, 63.4429 ms/op +WorkloadResult 3: 8 op, 547562612.00 ns, 68.4453 ms/op +// GC: 4 0 0 1312345024 8 +// Threading: 0 0 8 + +// AfterAll +// Benchmark Process 4328 has exited with code 0. + +Mean = 65.301 ms, StdErr = 1.581 ms (2.42%), N = 3, StdDev = 2.738 ms +Min = 63.443 ms, Q1 = 63.728 ms, Median = 64.014 ms, Q3 = 66.230 ms, Max = 68.445 ms +IQR = 2.501 ms, LowerFence = 59.977 ms, UpperFence = 69.981 ms +ConfidenceInterval = [15.345 ms; 115.256 ms] (CI 99.9%), Margin = 49.955 ms (76.50% of Mean) +Skewness = 0.37, Kurtosis = 0.67, MValue = 2 + +// ** Remained 4 (66.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:42 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2Omml --job ShortRun --benchmarkId 2 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 213430.00 ns, 213.4300 us/op +WorkloadJitting 1: 1 op, 393625252.00 ns, 393.6253 ms/op + +OverheadJitting 2: 1 op, 2417.00 ns, 2.4170 us/op +WorkloadJitting 2: 1 op, 269815324.00 ns, 269.8153 ms/op + +WorkloadPilot 1: 2 op, 347592572.00 ns, 173.7963 ms/op +WorkloadPilot 2: 3 op, 581683560.00 ns, 193.8945 ms/op + +WorkloadWarmup 1: 3 op, 516453475.00 ns, 172.1512 ms/op +WorkloadWarmup 2: 3 op, 421037320.00 ns, 140.3458 ms/op +WorkloadWarmup 3: 3 op, 416767505.00 ns, 138.9225 ms/op + +// BeforeActualRun +WorkloadActual 1: 3 op, 424876905.00 ns, 141.6256 ms/op +WorkloadActual 2: 3 op, 421670986.00 ns, 140.5570 ms/op +WorkloadActual 3: 3 op, 420468251.00 ns, 140.1561 ms/op + +// AfterActualRun +WorkloadResult 1: 3 op, 424876905.00 ns, 141.6256 ms/op +WorkloadResult 2: 3 op, 421670986.00 ns, 140.5570 ms/op +WorkloadResult 3: 3 op, 420468251.00 ns, 140.1561 ms/op +// GC: 3 0 0 821526216 3 +// Threading: 0 0 3 + +// AfterAll +// Benchmark Process 4340 has exited with code 0. + +Mean = 140.780 ms, StdErr = 0.439 ms (0.31%), N = 3, StdDev = 0.760 ms +Min = 140.156 ms, Q1 = 140.357 ms, Median = 140.557 ms, Q3 = 141.091 ms, Max = 141.626 ms +IQR = 0.735 ms, LowerFence = 139.254 ms, UpperFence = 142.193 ms +ConfidenceInterval = [126.921 ms; 154.638 ms] (CI 99.9%), Margin = 13.859 ms (9.84% of Mean) +Skewness = 0.27, Kurtosis = 0.67, MValue = 2 + +// ** Remained 3 (50.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:41 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2OmmlXslCompiledTransform --job ShortRun --benchmarkId 3 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 322189.00 ns, 322.1890 us/op +WorkloadJitting 1: 1 op, 418743150.00 ns, 418.7432 ms/op + +OverheadJitting 2: 1 op, 1308.00 ns, 1.3080 us/op +WorkloadJitting 2: 1 op, 188410738.00 ns, 188.4107 ms/op + +WorkloadPilot 1: 2 op, 364929316.00 ns, 182.4647 ms/op +WorkloadPilot 2: 3 op, 455696347.00 ns, 151.8988 ms/op +WorkloadPilot 3: 4 op, 538115179.00 ns, 134.5288 ms/op + +WorkloadWarmup 1: 4 op, 449686903.00 ns, 112.4217 ms/op +WorkloadWarmup 2: 4 op, 264506948.00 ns, 66.1267 ms/op +WorkloadWarmup 3: 4 op, 279975809.00 ns, 69.9940 ms/op + +// BeforeActualRun +WorkloadActual 1: 4 op, 272145855.00 ns, 68.0365 ms/op +WorkloadActual 2: 4 op, 317243695.00 ns, 79.3109 ms/op +WorkloadActual 3: 4 op, 275855346.00 ns, 68.9638 ms/op + +// AfterActualRun +WorkloadResult 1: 4 op, 272145855.00 ns, 68.0365 ms/op +WorkloadResult 2: 4 op, 317243695.00 ns, 79.3109 ms/op +WorkloadResult 3: 4 op, 275855346.00 ns, 68.9638 ms/op +// GC: 2 0 0 571892736 4 +// Threading: 0 0 4 + +// AfterAll +// Benchmark Process 4354 has exited with code 0. + +Mean = 72.104 ms, StdErr = 3.614 ms (5.01%), N = 3, StdDev = 6.259 ms +Min = 68.036 ms, Q1 = 68.500 ms, Median = 68.964 ms, Q3 = 74.137 ms, Max = 79.311 ms +IQR = 5.637 ms, LowerFence = 60.044 ms, UpperFence = 82.593 ms +ConfidenceInterval = [-42.080 ms; 186.288 ms] (CI 99.9%), Margin = 114.184 ms (158.36% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 + +// ** Remained 2 (33.3 %) benchmark(s) to run. Estimated finish 2026-11-10 12:41 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathML --job ShortRun --benchmarkId 4 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 231703.00 ns, 231.7030 us/op +WorkloadJitting 1: 1 op, 77134240.00 ns, 77.1342 ms/op + +WorkloadPilot 1: 2 op, 150578499.00 ns, 75.2892 ms/op +WorkloadPilot 2: 3 op, 207345795.00 ns, 69.1153 ms/op +WorkloadPilot 3: 4 op, 274145277.00 ns, 68.5363 ms/op +WorkloadPilot 4: 5 op, 320507335.00 ns, 64.1015 ms/op +WorkloadPilot 5: 6 op, 392906736.00 ns, 65.4845 ms/op +WorkloadPilot 6: 7 op, 451918692.00 ns, 64.5598 ms/op +WorkloadPilot 7: 8 op, 493632993.00 ns, 61.7041 ms/op +WorkloadPilot 8: 9 op, 612434056.00 ns, 68.0482 ms/op + +WorkloadWarmup 1: 9 op, 665683902.00 ns, 73.9649 ms/op +WorkloadWarmup 2: 9 op, 725019983.00 ns, 80.5578 ms/op +WorkloadWarmup 3: 9 op, 748641880.00 ns, 83.1824 ms/op + +// BeforeActualRun +WorkloadActual 1: 9 op, 754521066.00 ns, 83.8357 ms/op +WorkloadActual 2: 9 op, 757873546.00 ns, 84.2082 ms/op +WorkloadActual 3: 9 op, 785871016.00 ns, 87.3190 ms/op + +// AfterActualRun +WorkloadResult 1: 9 op, 754521066.00 ns, 83.8357 ms/op +WorkloadResult 2: 9 op, 757873546.00 ns, 84.2082 ms/op +WorkloadResult 3: 9 op, 785871016.00 ns, 87.3190 ms/op +// GC: 2 0 0 754003800 9 +// Threading: 0 0 9 + +// AfterAll +// Benchmark Process 4365 has exited with code 0. + +Mean = 85.121 ms, StdErr = 1.104 ms (1.30%), N = 3, StdDev = 1.913 ms +Min = 83.836 ms, Q1 = 84.022 ms, Median = 84.208 ms, Q3 = 85.764 ms, Max = 87.319 ms +IQR = 1.742 ms, LowerFence = 81.409 ms, UpperFence = 88.376 ms +ConfidenceInterval = [50.227 ms; 120.015 ms] (CI 99.9%), Margin = 34.894 ms (40.99% of Mean) +Skewness = 0.37, Kurtosis = 0.67, MValue = 2 + +// ** Remained 1 (16.7 %) benchmark(s) to run. Estimated finish 2026-11-10 12:42 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform --job ShortRun --benchmarkId 5 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX10v1,AVX512 BF16+FP16,AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 257217.00 ns, 257.2170 us/op +WorkloadJitting 1: 1 op, 997585070.00 ns, 997.5851 ms/op + +OverheadJitting 2: 1 op, 2672.00 ns, 2.6720 us/op +WorkloadJitting 2: 1 op, 98796798.00 ns, 98.7968 ms/op + +WorkloadPilot 1: 2 op, 195365121.00 ns, 97.6826 ms/op +WorkloadPilot 2: 3 op, 278141849.00 ns, 92.7139 ms/op +WorkloadPilot 3: 4 op, 384161812.00 ns, 96.0405 ms/op +WorkloadPilot 4: 5 op, 386366980.00 ns, 77.2734 ms/op +WorkloadPilot 5: 6 op, 286018584.00 ns, 47.6698 ms/op +WorkloadPilot 6: 7 op, 296156632.00 ns, 42.3081 ms/op +WorkloadPilot 7: 8 op, 307450654.00 ns, 38.4313 ms/op +WorkloadPilot 8: 9 op, 369228409.00 ns, 41.0254 ms/op +WorkloadPilot 9: 10 op, 369923360.00 ns, 36.9923 ms/op +WorkloadPilot 10: 11 op, 508794488.00 ns, 46.2540 ms/op + +WorkloadWarmup 1: 11 op, 391562015.00 ns, 35.5965 ms/op +WorkloadWarmup 2: 11 op, 381543315.00 ns, 34.6858 ms/op +WorkloadWarmup 3: 11 op, 381224150.00 ns, 34.6567 ms/op + +// BeforeActualRun +WorkloadActual 1: 11 op, 382249299.00 ns, 34.7499 ms/op +WorkloadActual 2: 11 op, 381096152.00 ns, 34.6451 ms/op +WorkloadActual 3: 11 op, 400971440.00 ns, 36.4519 ms/op + +// AfterActualRun +WorkloadResult 1: 11 op, 382249299.00 ns, 34.7499 ms/op +WorkloadResult 2: 11 op, 381096152.00 ns, 34.6451 ms/op +WorkloadResult 3: 11 op, 400971440.00 ns, 36.4519 ms/op +// GC: 0 0 0 240904664 11 +// Threading: 0 0 11 + +// AfterAll +// Benchmark Process 4380 has exited with code 0. + +Mean = 35.282 ms, StdErr = 0.586 ms (1.66%), N = 3, StdDev = 1.014 ms +Min = 34.645 ms, Q1 = 34.698 ms, Median = 34.750 ms, Q3 = 35.601 ms, Max = 36.452 ms +IQR = 0.903 ms, LowerFence = 33.342 ms, UpperFence = 36.956 ms +ConfidenceInterval = [16.778 ms; 53.786 ms] (CI 99.9%), Margin = 18.504 ms (52.45% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 12:42 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 206.155 ms, StdErr = 11.201 ms (5.43%), N = 3, StdDev = 19.400 ms +Min = 186.001 ms, Q1 = 196.882 ms, Median = 207.763 ms, Q3 = 216.232 ms, Max = 224.701 ms +IQR = 19.350 ms, LowerFence = 167.857 ms, UpperFence = 245.257 ms +ConfidenceInterval = [-147.776 ms; 560.085 ms] (CI 99.9%), Margin = 353.931 ms (171.68% of Mean) +Skewness = -0.08, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[168.346 ms ; 198.577 ms) | @ +[198.577 ms ; 233.887 ms) | @@ +--------------------------------------------------- + +StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 65.301 ms, StdErr = 1.581 ms (2.42%), N = 3, StdDev = 2.738 ms +Min = 63.443 ms, Q1 = 63.728 ms, Median = 64.014 ms, Q3 = 66.230 ms, Max = 68.445 ms +IQR = 2.501 ms, LowerFence = 59.977 ms, UpperFence = 69.981 ms +ConfidenceInterval = [15.345 ms; 115.256 ms] (CI 99.9%), Margin = 49.955 ms (76.50% of Mean) +Skewness = 0.37, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[60.951 ms ; 66.220 ms) | @@ +[66.220 ms ; 70.937 ms) | @ +--------------------------------------------------- + +StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 140.780 ms, StdErr = 0.439 ms (0.31%), N = 3, StdDev = 0.760 ms +Min = 140.156 ms, Q1 = 140.357 ms, Median = 140.557 ms, Q3 = 141.091 ms, Max = 141.626 ms +IQR = 0.735 ms, LowerFence = 139.254 ms, UpperFence = 142.193 ms +ConfidenceInterval = [126.921 ms; 154.638 ms] (CI 99.9%), Margin = 13.859 ms (9.84% of Mean) +Skewness = 0.27, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[139.465 ms ; 141.760 ms) | @@@ +--------------------------------------------------- + +StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 72.104 ms, StdErr = 3.614 ms (5.01%), N = 3, StdDev = 6.259 ms +Min = 68.036 ms, Q1 = 68.500 ms, Median = 68.964 ms, Q3 = 74.137 ms, Max = 79.311 ms +IQR = 5.637 ms, LowerFence = 60.044 ms, UpperFence = 82.593 ms +ConfidenceInterval = [-42.080 ms; 186.288 ms] (CI 99.9%), Margin = 114.184 ms (158.36% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[67.978 ms ; 79.369 ms) | @@@ +--------------------------------------------------- + +StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 85.121 ms, StdErr = 1.104 ms (1.30%), N = 3, StdDev = 1.913 ms +Min = 83.836 ms, Q1 = 84.022 ms, Median = 84.208 ms, Q3 = 85.764 ms, Max = 87.319 ms +IQR = 1.742 ms, LowerFence = 81.409 ms, UpperFence = 88.376 ms +ConfidenceInterval = [50.227 ms; 120.015 ms] (CI 99.9%), Margin = 34.894 ms (40.99% of Mean) +Skewness = 0.37, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[82.095 ms ; 85.763 ms) | @@ +[85.763 ms ; 89.060 ms) | @ +--------------------------------------------------- + +StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 35.282 ms, StdErr = 0.586 ms (1.66%), N = 3, StdDev = 1.014 ms +Min = 34.645 ms, Q1 = 34.698 ms, Median = 34.750 ms, Q3 = 35.601 ms, Max = 36.452 ms +IQR = 0.903 ms, LowerFence = 33.342 ms, UpperFence = 36.956 ms +ConfidenceInterval = [16.778 ms; 53.786 ms] (CI 99.9%), Margin = 18.504 ms (52.45% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[34.625 ms ; 36.472 ms) | @@@ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|-------------------------------- |----------:|----------:|----------:|----------:|----------:| +| Omml2MathML | 206.15 ms | 353.93 ms | 19.400 ms | 1666.6667 | 461.45 MB | +| Omml2MathMLXslCompiledTransform | 65.30 ms | 49.96 ms | 2.738 ms | 500.0000 | 156.44 MB | +| MathML2Omml | 140.78 ms | 13.86 ms | 0.760 ms | 1000.0000 | 261.16 MB | +| MathML2OmmlXslCompiledTransform | 72.10 ms | 114.18 ms | 6.259 ms | 500.0000 | 136.35 MB | +| Mtef2MathML | 85.12 ms | 34.89 ms | 1.913 ms | 222.2222 | 79.9 MB | +| Mtef2MathMLXslCompiledTransform | 35.28 ms | 18.50 ms | 1.014 ms | - | 20.89 MB | + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + StdDev : Standard deviation of all measurements + Gen0 : GC Generation 0 collects per 1000 operations + Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) + 1 ms : 1 Millisecond (0.001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:01:07 (67.29 sec), executed benchmarks: 6 + +Global total time: 00:01:46 (106.57 sec), executed benchmarks: 6 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md new file mode 100644 index 0000000..9c2a80e --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md @@ -0,0 +1,20 @@ +``` + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +``` +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|-------------------------------- |----------:|----------:|----------:|----------:|----------:| +| Omml2MathML | 206.15 ms | 353.93 ms | 19.400 ms | 1666.6667 | 461.45 MB | +| Omml2MathMLXslCompiledTransform | 65.30 ms | 49.96 ms | 2.738 ms | 500.0000 | 156.44 MB | +| MathML2Omml | 140.78 ms | 13.86 ms | 0.760 ms | 1000.0000 | 261.16 MB | +| MathML2OmmlXslCompiledTransform | 72.10 ms | 114.18 ms | 6.259 ms | 500.0000 | 136.35 MB | +| Mtef2MathML | 85.12 ms | 34.89 ms | 1.913 ms | 222.2222 | 79.9 MB | +| Mtef2MathMLXslCompiledTransform | 35.28 ms | 18.50 ms | 1.014 ms | - | 20.89 MB | diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv new file mode 100644 index 0000000..1dcae01 --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv @@ -0,0 +1,7 @@ +Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Gen0,Allocated +Omml2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,206.15 ms,353.93 ms,19.400 ms,1666.6667,461.45 MB +Omml2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,65.30 ms,49.96 ms,2.738 ms,500.0000,156.44 MB +MathML2Omml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,140.78 ms,13.86 ms,0.760 ms,1000.0000,261.16 MB +MathML2OmmlXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,72.10 ms,114.18 ms,6.259 ms,500.0000,136.35 MB +Mtef2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,85.12 ms,34.89 ms,1.913 ms,222.2222,79.9 MB +Mtef2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,35.28 ms,18.50 ms,1.014 ms,0.0000,20.89 MB diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html new file mode 100644 index 0000000..51f050a --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html @@ -0,0 +1,37 @@ + + + + +SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-124057 + + + + +

+BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
+Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores
+.NET SDK 10.0.114
+  [Host]   : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4
+  ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4
+
+
Job=ShortRun  IterationCount=3  LaunchCount=1  
+WarmupCount=3  
+
+ + + + + + + + + + +
Method MeanErrorStdDevGen0Allocated
Omml2MathML206.15 ms353.93 ms19.400 ms1666.6667461.45 MB
Omml2MathMLXslCompiledTransform65.30 ms49.96 ms2.738 ms500.0000156.44 MB
MathML2Omml140.78 ms13.86 ms0.760 ms1000.0000261.16 MB
MathML2OmmlXslCompiledTransform72.10 ms114.18 ms6.259 ms500.0000136.35 MB
Mtef2MathML85.12 ms34.89 ms1.913 ms222.222279.9 MB
Mtef2MathMLXslCompiledTransform35.28 ms18.50 ms1.014 ms-20.89 MB
+ + diff --git a/benchmarks/SharpEquations.Benchmarks/Samples.cs b/benchmarks/SharpEquations.Benchmarks/Samples.cs index 334c81b..16ca9cf 100644 --- a/benchmarks/SharpEquations.Benchmarks/Samples.cs +++ b/benchmarks/SharpEquations.Benchmarks/Samples.cs @@ -39,6 +39,11 @@ public static string[] UnicodeMathCorpus() return json.RootElement.EnumerateArray().Select(example => example.GetProperty("input").GetString()!).ToArray(); } + public static byte[][] MtefCorpus() => + Directory.GetFiles(DataPath("mtef"), "*.*", SearchOption.AllDirectories).OrderBy(path => path, StringComparer.Ordinal).Select(File.ReadAllBytes).ToArray(); + + public static string Stylesheet(string name) => DataPath("xsl", name); + public static XElement[] OmmlCorpus() => Directory.GetFiles(DataPath("omml"), "*.omml").OrderBy(path => path, StringComparer.Ordinal).Select(path => XElement.Load(path)).ToArray(); } diff --git a/benchmarks/SharpEquations.Benchmarks/SharpEquations.Benchmarks.csproj b/benchmarks/SharpEquations.Benchmarks/SharpEquations.Benchmarks.csproj index 04931b3..e4a1853 100644 --- a/benchmarks/SharpEquations.Benchmarks/SharpEquations.Benchmarks.csproj +++ b/benchmarks/SharpEquations.Benchmarks/SharpEquations.Benchmarks.csproj @@ -19,6 +19,8 @@ + + diff --git a/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs b/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs new file mode 100644 index 0000000..782404e --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/StylesheetBenchmarks.cs @@ -0,0 +1,143 @@ +namespace SharpEquations.Benchmarks +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Xml; + using System.Xml.Linq; + using System.Xml.Xsl; + using BenchmarkDotNet.Attributes; + using SharpEquations.Internal.Mtef; + using SharpEquations.Internal.Xslt; + + /// + /// The stylesheets alone, over the corpora of the tests: compiled to C# by SharpEquations.XsltGenerator, as the + /// library runs them, and run by XslCompiledTransform, as it ran them before (the output written as text and read + /// again). The times are per corpus. + /// + [MemoryDiagnoser] + public class StylesheetBenchmarks + { + private XElement[] omml = []; + private XElement[] mathML = []; + private XElement[] mtef = []; + private XslCompiledTransform omml2mml = null!; + private XslCompiledTransform mml2omml = null!; + private XslCompiledTransform mtef2mml = null!; + + [GlobalSetup] + public void Setup() + { + var equations = Samples.UnicodeMathCorpus() + .Select(source => Equation.TryParse(source, EquationFormat.UnicodeMath, out var equation) ? equation : null) + .OfType() + .Concat(Samples.OmmlCorpus().Select(source => Equation.Parse(source, EquationFormat.Omml))) + .ToArray(); + mathML = equations.Select(equation => equation.ToMathML()).ToArray(); + omml = Samples.OmmlCorpus().SelectMany(source => source.DescendantsAndSelf(MathMLNamespaces.Omml + "oMath")) + .Concat(equations.Select(equation => equation.ToOmml())) + .ToArray(); + mtef = Samples.MtefCorpus().Select(Records).OfType().ToArray(); + omml2mml = Load("omml2mml.xsl"); + omml = omml.Where(oMath => Converts(omml2mml, oMath)).ToArray(); + mml2omml = Load("mml2omml.xsl"); + mtef2mml = Load("mtef2mml.xsl"); + } + + // an equation written in the text of another is two document elements for the stylesheet, and + // XslCompiledTransform splits the characters outside the basic plane + private static bool Converts(XslCompiledTransform stylesheet, XElement oMath) + { + try + { + return Omml2mmlStylesheet.Transform(oMath) != null && Run(stylesheet, [oMath]) == 1; + } + catch (Exception e) when (e is XmlException or XsltException or ArgumentException) + { + return false; + } + } + + private static XElement? Records(byte[] bytes) + { + var data = bytes.AsSpan(); + if (MtefParser.HasEquationNativeHeader(data)) + data = data.Slice(data[0] | data[1] << 8); + try + { + var xml = MtefReader.Read(data); + MtefPreprocessor.Prepare(xml); + Mtef2mmlStylesheet.Transform(xml); + return xml; + } + catch (Exception e) when (e is not OutOfMemoryException) + { + return null; + } + } + + private static XslCompiledTransform Load(string name) + { + using var reader = XmlReader.Create(Samples.Stylesheet(name), new XmlReaderSettings { DtdProcessing = DtdProcessing.Prohibit, XmlResolver = null }); + var transform = new XslCompiledTransform(); + transform.Load(reader, XsltSettings.Default, null); + return transform; + } + + private static int Count(XElement? element) => element == null ? 0 : 1; + + private static int Run(XslCompiledTransform stylesheet, XElement[] inputs) + { + var count = 0; + foreach (var input in inputs) + { + var output = new StringWriter(); + using (var reader = new XDocument(input).CreateReader()) + stylesheet.Transform(reader, null, output); + var text = output.ToString(); + if (text.Trim().Length == 0) + continue; + using var result = XmlReader.Create(new StringReader(text), new XmlReaderSettings { DtdProcessing = DtdProcessing.Prohibit, XmlResolver = null }); + count += Count(XElement.Load(result, LoadOptions.PreserveWhitespace)); + } + return count; + } + + [Benchmark] + public int Omml2MathML() + { + var count = 0; + foreach (var input in omml) + count += Count(Omml2mmlStylesheet.Transform(input)); + return count; + } + + [Benchmark] + public int Omml2MathMLXslCompiledTransform() => Run(omml2mml, omml); + + [Benchmark] + public int MathML2Omml() + { + var count = 0; + foreach (var input in mathML) + count += Count(Mml2ommlStylesheet.Transform(input)); + return count; + } + + [Benchmark] + public int MathML2OmmlXslCompiledTransform() => Run(mml2omml, mathML); + + [Benchmark] + public int Mtef2MathML() + { + var count = 0; + foreach (var input in mtef) + count += Count(Mtef2mmlStylesheet.Transform(input)); + return count; + } + + [Benchmark] + public int Mtef2MathMLXslCompiledTransform() => Run(mtef2mml, mtef); + } +} diff --git a/src/SharpEquations/SharpEquations.csproj b/src/SharpEquations/SharpEquations.csproj index 7c43b0b..6454104 100644 --- a/src/SharpEquations/SharpEquations.csproj +++ b/src/SharpEquations/SharpEquations.csproj @@ -18,6 +18,7 @@ + From 1cd4bea7c8027b942d6c9d6ff570717fc3aaaaa1 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 10 Nov 2026 12:52:18 +0000 Subject: [PATCH 02/11] XSLT generator: translate() with its map built once, substring() and string-length() without lists The map of a translate() with constant arguments is a static table, and that of the others is kept from one call to the next; a text that nothing is replaced in is returned as it is. Co-Authored-By: Claude Fable 5.2 Claude-Session: https://claude.ai/code/session_01Q8QQiasbLr6WtXXCEP1zrJ --- .../StylesheetCompiler.cs | 22 +++++ .../XPathCompiler.cs | 4 +- .../Internal/Xslt/TranslateMap.cs | 95 +++++++++++++++++++ .../Internal/Xslt/XPathFunctions.cs | 60 +++++++++--- 4 files changed, 165 insertions(+), 16 deletions(-) create mode 100644 src/SharpEquations/Internal/Xslt/TranslateMap.cs diff --git a/src/SharpEquations.XsltGenerator/StylesheetCompiler.cs b/src/SharpEquations.XsltGenerator/StylesheetCompiler.cs index 605164e..149fc49 100644 --- a/src/SharpEquations.XsltGenerator/StylesheetCompiler.cs +++ b/src/SharpEquations.XsltGenerator/StylesheetCompiler.cs @@ -29,6 +29,7 @@ internal sealed class StylesheetCompiler private readonly Dictionary names = new Dictionary(); private readonly Dictionary tests = new Dictionary(); + private readonly Dictionary statics = new Dictionary(); private readonly Dictionary namedTemplates = new Dictionary(); private readonly Dictionary globals = new Dictionary(); private readonly Dictionary modes = new Dictionary { [""] = 0 }; @@ -189,6 +190,27 @@ public string NodeTest(NodeTestSyntax test, XElement scope) return field; } + /// A static field of the class with this value, the same for the same value. + public string StaticField(string type, string init) + { + var key = type + " " + init; + if (!statics.TryGetValue(key, out var field)) + { + field = "Static" + statics.Count; + statics.Add(key, field); + staticFields.Line("private static readonly " + type + " " + field + " = " + init + ";"); + } + return field; + } + + /// A new field of the stylesheet that runs. + public string InstanceField(string type) + { + var field = NewName("field"); + instanceFields.Line("private " + type + " " + field + ";"); + return field; + } + private static string Namespace(string? prefix, XElement scope) { if (prefix == null) diff --git a/src/SharpEquations.XsltGenerator/XPathCompiler.cs b/src/SharpEquations.XsltGenerator/XPathCompiler.cs index 847134b..527508e 100644 --- a/src/SharpEquations.XsltGenerator/XPathCompiler.cs +++ b/src/SharpEquations.XsltGenerator/XPathCompiler.cs @@ -260,7 +260,9 @@ void Arity(int min, int max) return new Compiled("NormalizeSpace(" + StringArgument(0) + ")", XType.String); case "translate": Arity(3, 3); - return new Compiled("Translate(" + Str(args[0]) + ", " + Str(args[1]) + ", " + Str(args[2]) + ")", XType.String); + if (function.Arguments[1] is LiteralExpr from && function.Arguments[2] is LiteralExpr to) + return new Compiled(stylesheet.StaticField("TranslateMap", "new TranslateMap(" + Literal(from.Value) + ", " + Literal(to.Value) + ")") + ".Apply(" + Str(args[0]) + ")", XType.String); + return new Compiled("Translate(" + Str(args[0]) + ", " + Str(args[1]) + ", " + Str(args[2]) + ", ref " + stylesheet.InstanceField("TranslateMap?") + ")", XType.String); case "boolean": Arity(1, 1); return new Compiled(Bool(args[0]), XType.Boolean); diff --git a/src/SharpEquations/Internal/Xslt/TranslateMap.cs b/src/SharpEquations/Internal/Xslt/TranslateMap.cs new file mode 100644 index 0000000..bdb858d --- /dev/null +++ b/src/SharpEquations/Internal/Xslt/TranslateMap.cs @@ -0,0 +1,95 @@ +#nullable enable + +namespace SharpEquations.Internal.Xslt +{ + using System.Collections.Generic; + using System.Text; + + /// The map of an XPath translate(), by code points: the characters replaced and those removed. + internal sealed class TranslateMap + { + private const int Keep = -1; + private const int Remove = -2; + + private readonly string from; + private readonly string to; + private readonly int[] ascii = new int[128]; + private readonly Dictionary? others; + + public TranslateMap(string from, string to) + { + this.from = from; + this.to = to; + for (var i = 0; i < ascii.Length; i++) + ascii[i] = Keep; + var target = new List(); + foreach (var rune in to.EnumerateRunes()) + target.Add(rune.Value); + var index = 0; + foreach (var rune in from.EnumerateRunes()) + { + var replacement = index < target.Count ? target[index] : Remove; + index++; + // the first occurrence of a character in the map is the one that counts + if (rune.Value < ascii.Length) + { + if (ascii[rune.Value] == Keep) + ascii[rune.Value] = replacement; + } + else + { + others ??= new Dictionary(); + if (!others.TryGetValue(rune.Value, out _)) + others[rune.Value] = replacement; + } + } + } + + public bool Maps(string from, string to) => this.from == from && this.to == to; + + private int Find(int codePoint) + { + if (codePoint < ascii.Length) + return ascii[codePoint]; + return others != null && others.TryGetValue(codePoint, out var replacement) ? replacement : Keep; + } + + /// The text translated: the text itself when nothing in it is replaced or removed. + public string Apply(string s) + { + StringBuilder? result = null; + var index = 0; + foreach (var rune in s.EnumerateRunes()) + { + var replacement = Find(rune.Value); + // a lone surrogate, which reads as U+FFFD, is written as U+FFFD + if (replacement == Keep && rune.Value == 0xFFFD && s[index] != '�') + replacement = 0xFFFD; + if (replacement != Keep && result == null) + result = new StringBuilder(s, 0, index, s.Length); + if (result != null) + { + switch (replacement) + { + case Keep when rune.IsBmp: + result.Append((char)rune.Value); + break; + case Keep: + result.Append(rune.ToString()); + break; + case Remove: + break; + case <= 0xFFFF: + result.Append((char)replacement); + break; + default: + result.Append(char.ConvertFromUtf32(replacement)); + break; + } + } + index += rune.IsBmp ? 1 : 2; + } + return result == null ? s : result.ToString(); + } + } +} diff --git a/src/SharpEquations/Internal/Xslt/XPathFunctions.cs b/src/SharpEquations/Internal/Xslt/XPathFunctions.cs index e3576a0..f083155 100644 --- a/src/SharpEquations/Internal/Xslt/XPathFunctions.cs +++ b/src/SharpEquations/Internal/Xslt/XPathFunctions.cs @@ -605,9 +605,39 @@ public static string Substring(string s, double start, double length) { var first = Round(start); var end = first + Round(length); + var position = 0; + var index = 0; + var from = -1; + var to = 0; + foreach (var rune in s.EnumerateRunes()) + { + position++; + var next = index + (rune.IsBmp ? 1 : 2); + if (position >= first && position < end) + { + // a lone surrogate, which reads as U+FFFD, is written as U+FFFD + if (rune.Value == 0xFFFD && s[index] != '\uFFFD') + return SubstringOfRunes(s, first, end); + if (from < 0) + from = index; + to = next; + } + else if (from >= 0) + { + break; + } + index = next; + } + if (from < 0) + return ""; + return from == 0 && to == s.Length ? s : s.Substring(from, to - from); + } + + private static string SubstringOfRunes(string s, double first, double end) + { var result = new StringBuilder(); var position = 0; - foreach (var rune in CodePoints.Of(s)) + foreach (var rune in s.EnumerateRunes()) { position++; if (position >= first && position < end) @@ -616,7 +646,13 @@ public static string Substring(string s, double start, double length) return result.ToString(); } - public static double StringLength(string s) => CodePoints.Of(s).Count(); + public static double StringLength(string s) + { + var length = 0; + foreach (var rune in s.EnumerateRunes()) + length++; + return length; + } public static string NormalizeSpace(string s) { @@ -637,20 +673,14 @@ public static string NormalizeSpace(string s) return result.ToString(); } - public static string Translate(string s, string from, string to) + public static string Translate(string s, string from, string to) => new TranslateMap(from, to).Apply(s); + + /// translate() with the map of the last call from the same place, which mostly has the same arguments. + public static string Translate(string s, string from, string to, ref TranslateMap? map) { - var source = CodePoints.Of(from).ToList(); - var target = CodePoints.Of(to).ToList(); - var result = new StringBuilder(s.Length); - foreach (var rune in CodePoints.Of(s)) - { - var index = source.IndexOf(rune); - if (index < 0) - result.Append(rune.ToString()); - else if (index < target.Count) - result.Append(target[index].ToString()); - } - return result.ToString(); + if (map == null || !map.Maps(from, to)) + map = new TranslateMap(from, to); + return map.Apply(s); } public static double Round(double value) From b58e28c6c365cc83cf33744b0b32ae8c594454ed Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 10 Nov 2026 23:32:35 +0000 Subject: [PATCH 03/11] XSLT generator: location paths as loops, typed parameters, text kept as strings A location path is compiled to loops over the nodes (first child and next sibling, the node test inlined, names compared as static XName fields), in the method that uses it or in a method of its own whose parameters are what the expression reads; no node-set is built for a test, the string value of the first node, a count or a comparison, and position() and last() are counted only by the predicates that read them. xsl:for-each and xsl:apply-templates walk the nodes without a list unless the content, or a template of the mode, reads their number. The stylesheet is compiled until nothing new is learnt of its templates: the parameters of a named template have the type of the values they are given, and a template is given the context node, position and size only if it reads them. A variable whose content only writes text is a string, written as an expression when it is only values and choices, and a global string that does not depend on the input is computed once. Co-Authored-By: Claude Fable 5.2 Claude-Session: https://claude.ai/code/session_01Q8QQiasbLr6WtXXCEP1zrJ --- .../CodeWriter.cs | 18 + .../StylesheetCompiler.cs | 742 +++++++--- .../XPathCompiler.cs | 1202 +++++++++++++++-- .../XsltGenerator.cs | 11 +- src/SharpEquations/Internal/Xslt/NodeTest.cs | 75 - .../Internal/Xslt/ResultFragment.cs | 18 +- .../Internal/Xslt/XPathFunctions.cs | 149 +- .../Internal/Xslt/XsltOutput.cs | 45 +- 8 files changed, 1795 insertions(+), 465 deletions(-) delete mode 100644 src/SharpEquations/Internal/Xslt/NodeTest.cs diff --git a/src/SharpEquations.XsltGenerator/CodeWriter.cs b/src/SharpEquations.XsltGenerator/CodeWriter.cs index 537b48d..de3bdfe 100644 --- a/src/SharpEquations.XsltGenerator/CodeWriter.cs +++ b/src/SharpEquations.XsltGenerator/CodeWriter.cs @@ -38,6 +38,24 @@ public CodeWriter Append(CodeWriter other) return this; } + /// Text that is already indented. + public CodeWriter Raw(string code) + { + text.Append(code); + return this; + } + + /// The lines of another writer, written without indentation, at the indentation of this one. + public CodeWriter Indented(CodeWriter other) + { + foreach (var line in other.text.ToString().Split('\n')) + { + if (line.Length > 0) + Line(line); + } + return this; + } + public override string ToString() => text.ToString(); } } diff --git a/src/SharpEquations.XsltGenerator/StylesheetCompiler.cs b/src/SharpEquations.XsltGenerator/StylesheetCompiler.cs index 149fc49..a9c4508 100644 --- a/src/SharpEquations.XsltGenerator/StylesheetCompiler.cs +++ b/src/SharpEquations.XsltGenerator/StylesheetCompiler.cs @@ -7,10 +7,75 @@ namespace SharpEquations.XsltGenerator using System.Xml.Linq; /// - /// An XSLT 1.0 stylesheet compiled to a C# class: a method for each template, the dispatch of - /// xsl:apply-templates for each mode (by the name of the element first), a lazy property for each - /// global variable. What the stylesheets of SharpEquations do not use (keys, sorting, numbering, imports, - /// extension functions) is reported as an error. + /// What a compilation of the stylesheet takes as known of its templates, parameters and global variables, and + /// learns of them: the stylesheet is compiled again, with what the compilation before learnt, until nothing new + /// is learnt. Every fact starts as the one that gives the best code and only moves to the one that is always + /// right, so the last compilation holds. + /// + internal sealed class Facts + { + /// The types of the values given to the parameters of the named templates. + public Dictionary ParameterTypes { get; } = new Dictionary(); + + /// The parameters of the named templates that a call leaves to their default. + public HashSet Omitted { get; } = new HashSet(); + + /// The named templates that read the context node, its position, its size. + public HashSet NodeUsed { get; } = new HashSet(); + + public HashSet PositionUsed { get; } = new HashSet(); + + public HashSet SizeUsed { get; } = new HashSet(); + + /// The modes with a template that reads the position of the node, the size. + public HashSet ModePosition { get; } = new HashSet(); + + public HashSet ModeSize { get; } = new HashSet(); + + /// The named templates that write more than text. + public HashSet NotText { get; } = new HashSet(); + + /// The named templates that read the input, or a global variable that depends on it. + public HashSet Impure { get; } = new HashSet(); + + /// The global variables that depend on the input, or are not strings. + public HashSet Dynamic { get; } = new HashSet(); + + private IEnumerable> Sets => new[] { Omitted, NodeUsed, PositionUsed, SizeUsed, ModePosition, ModeSize, NotText, Impure, Dynamic }; + + public static string Parameter(string template, string parameter) => template + "\n" + parameter; + + public static XType Join(XType left, XType right) + { + if (left == XType.None) + return right; + return right == XType.None || left == right ? left : XType.Any; + } + + public void Give(string parameter, XType type) => + ParameterTypes[parameter] = Join(ParameterTypes.TryGetValue(parameter, out var known) ? known : XType.None, type); + + /// Adds what another compilation learnt; whether it was anything new. + public bool Add(Facts other) + { + var before = Count; + foreach (var parameter in other.ParameterTypes) + Give(parameter.Key, parameter.Value); + foreach (var pair in Sets.Zip(other.Sets, (mine, theirs) => (mine, theirs))) + pair.mine.UnionWith(pair.theirs); + return Count != before; + } + + // every fact moves one way, so the count tells whether one moved + private int Count => Sets.Sum(s => s.Count) + ParameterTypes.Values.Sum(t => t == XType.None ? 0 : t == XType.Any ? 2 : 1); + } + + /// + /// An XSLT 1.0 stylesheet compiled to a C# class: a method for each template, with typed parameters for the named + /// ones; the dispatch of xsl:apply-templates for each mode (by the name of the element first); a lazy + /// property for each global variable, computed once for all when it is a string that does not depend on the + /// input; a method for each expression that walks the tree. What the stylesheets of SharpEquations do not use + /// (keys, sorting, numbering, imports, extension functions) is reported as an error. /// internal sealed class StylesheetCompiler { @@ -19,34 +84,41 @@ internal sealed class StylesheetCompiler private readonly XElement stylesheet; private readonly string className; private readonly string fileName; + private readonly Facts facts; private readonly XPathCompiler xpath; + private readonly Names locals = new Names(); private readonly CodeWriter nameFields = new CodeWriter(2); - private readonly CodeWriter testFields = new CodeWriter(2); private readonly CodeWriter staticFields = new CodeWriter(2); private readonly CodeWriter instanceFields = new CodeWriter(2); private readonly CodeWriter members = new CodeWriter(2); private readonly Dictionary names = new Dictionary(); - private readonly Dictionary tests = new Dictionary(); + private readonly Dictionary helpers = new Dictionary(); private readonly Dictionary statics = new Dictionary(); private readonly Dictionary namedTemplates = new Dictionary(); private readonly Dictionary globals = new Dictionary(); private readonly Dictionary modes = new Dictionary { [""] = 0 }; private readonly List rules = new List(); - private int counter; private sealed class NamedTemplate { - public NamedTemplate(string method, List parameters) + public NamedTemplate(string name, string method, List parameters, bool matches) { + Name = name; Method = method; Parameters = parameters; + Matches = matches; } + public string Name { get; } + public string Method { get; } public List Parameters { get; } + + /// Whether the template has a pattern too, and takes its parameters from xsl:apply-templates. + public bool Matches { get; } } private sealed class GlobalVariable @@ -116,17 +188,24 @@ public Rule(int index, XElement template, string method, int mode, double priori public List Steps { get; } public Step? Last => Steps.Count == 0 ? null : Steps[Steps.Count - 1].Step; + + /// Whether the rule matches every node it is tried on, those its last step tells by their kind or name. + public bool Always { get; set; } } - public StylesheetCompiler(XElement stylesheet, string className, string fileName) + public StylesheetCompiler(XElement stylesheet, string className, string fileName, Facts facts) { this.stylesheet = stylesheet; this.className = className; this.fileName = fileName; + this.facts = facts; xpath = new XPathCompiler(this); } - public string NewName(string prefix) => prefix + (++counter); + /// What this compilation learnt. + public Facts Learnt { get; } = new Facts(); + + public string NewName(string prefix) => locals.New(prefix); public static XsltException Error(XObject node, string message) { @@ -148,48 +227,6 @@ public string Name(XName name) return field; } - public string NodeTest(NodeTestSyntax test, XElement scope) - { - string key; - string init; - switch (test.Kind) - { - case TestKind.Name: - { - var name = XName.Get(test.Local!, Namespace(test.Prefix, scope)); - key = "name " + name; - init = "NodeTest.Named(" + Name(name) + ")"; - break; - } - case TestKind.Namespace: - { - var ns = Namespace(test.Prefix, scope); - key = "ns " + ns; - init = "NodeTest.InNamespace(" + XPathCompiler.Literal(ns) + ")"; - break; - } - case TestKind.AnyName: - return "NodeTest.AnyName"; - case TestKind.Node: - return "NodeTest.Node"; - case TestKind.Text: - return "NodeTest.Text"; - case TestKind.Comment: - return "NodeTest.Comment"; - default: - key = "pi " + test.Local; - init = "NodeTest.ProcessingInstruction(" + (test.Local == null ? "null" : XPathCompiler.Literal(test.Local)) + ")"; - break; - } - if (!tests.TryGetValue(key, out var field)) - { - field = "Test" + tests.Count; - tests.Add(key, field); - testFields.Line("private static readonly NodeTest " + field + " = " + init + ";"); - } - return field; - } - /// A static field of the class with this value, the same for the same value. public string StaticField(string type, string init) { @@ -203,15 +240,28 @@ public string StaticField(string type, string init) return field; } - /// A new field of the stylesheet that runs. - public string InstanceField(string type) + /// A static field for a value kept from one use to the next. + public string CacheField(string type) { - var field = NewName("field"); - instanceFields.Line("private " + type + " " + field + ";"); + var field = NewName("Cache"); + staticFields.Line("private static " + type + " " + field + ";"); return field; } - private static string Namespace(string? prefix, XElement scope) + /// A method of the class with this body, the same for the same body; its name. + public string HelperMethod(string returnType, string parameters, string body) + { + var key = returnType + " (" + parameters + ")\n" + body; + if (!helpers.TryGetValue(key, out var method)) + { + method = "Path" + helpers.Count; + helpers.Add(key, method); + members.Line().Open("private " + returnType + " " + method + "(" + parameters + ")").Raw(body).Close(); + } + return method; + } + + public static string Namespace(string? prefix, XElement scope) { if (prefix == null) return ""; @@ -256,7 +306,7 @@ public string Compile() { var name = Attr(templates[i], "name", false); if (name != null) - namedTemplates[name] = new NamedTemplate("Named" + i, TemplateParameters(templates[i]).Select(p => Attr(p, "name", true)!).ToList()); + namedTemplates[name] = new NamedTemplate(name, "Named" + i, TemplateParameters(templates[i]).Select(p => Attr(p, "name", true)!).ToList(), Attr(templates[i], "match", false) != null); } for (var i = 0; i < templates.Count; i++) @@ -305,7 +355,7 @@ private string Assemble() .Line() .Line("// the stylesheet " + fileName + ", compiled to C#") .Open("internal sealed partial class " + className); - file.Append(nameFields).Append(testFields).Append(staticFields); + file.Append(nameFields).Append(staticFields); file.Line() .Line("private readonly XsltOutput output = new XsltOutput();") .Line("private readonly XObject root;") @@ -317,7 +367,7 @@ private string Assemble() .Open("public static partial XElement? Transform(XElement input)") .Line("var document = new XDocument(input);") .Line("var stylesheet = new " + className + "(document);") - .Line("stylesheet.Apply0(Single(document), null);") + .Line("stylesheet.Dispatch0(document, 1, 1, null);") .Line("return stylesheet.output.Result();") .Close(); file.Append(members); @@ -338,34 +388,58 @@ private void CompileTemplate(XElement template, int index) if (name != null) { var named = namedTemplates[name]; - var signature = string.Concat(named.Parameters.Select((p, i) => ", object? a" + i)); + var types = named.Parameters.Select(p => ParameterType(named, p)).ToList(); + if (named.Matches) + { + foreach (var parameter in named.Parameters) + Learnt.Give(Facts.Parameter(name, parameter), XType.Any); + } + var signature = string.Concat(named.Parameters.Select((p, i) => ", " + XPathCompiler.TypeName(types[i]) + "? a" + i)); + var focus = new Focus(); + var purity = new Purity(); var w = new CodeWriter(2); w.Line().Open("private void " + named.Method + "(XObject n0, int p0, int s0" + signature + ")"); - CompileBody(template, parameters, i => "a" + i, w); + CompileBody(template, parameters, i => "a" + i, i => types[i], named, focus, purity, w); w.Close(); members.Append(w); + if (focus.NodeUsed || focus.CurrentUsed) + Learnt.NodeUsed.Add(name); + if (focus.PositionUsed) + Learnt.PositionUsed.Add(name); + if (focus.SizeUsed) + Learnt.SizeUsed.Add(name); + if (purity.Impure) + Learnt.Impure.Add(name); + if (!IsTextOnly(template.Nodes())) + Learnt.NotText.Add(name); } if (match == null) return; + var mode = ModeIndex((string?)template.Attribute("mode")); var method = "Template" + index; var body = new CodeWriter(2); body.Line().Open("private void " + method + "(XObject n0, int p0, int s0, TemplateArguments? args)"); + var templateFocus = new Focus(); if (name != null) { var named = namedTemplates[name]; - body.Line(named.Method + "(n0, p0, s0" + string.Concat(named.Parameters.Select(p => ", args?.Get(" + XPathCompiler.Literal(p) + ")")) + ");"); + var context = TemplateContext(template, templateFocus, new Purity(), new Scope(null)); + body.Line(Call(named, context, named.Parameters.Select(p => "args?.Get(" + XPathCompiler.Literal(p) + ")"))); } else { var names = parameters.Select(p => Attr(p, "name", true)!).ToList(); - CompileBody(template, parameters, i => "args?.Get(" + XPathCompiler.Literal(names[i]) + ")", body); + CompileBody(template, parameters, i => "args?.Get(" + XPathCompiler.Literal(names[i]) + ")", i => XType.Any, null, templateFocus, new Purity(), body); } body.Close(); members.Append(body); + if (templateFocus.PositionUsed) + Learnt.ModePosition.Add(ModeKey(mode)); + if (templateFocus.SizeUsed) + Learnt.ModeSize.Add(ModeKey(mode)); - var mode = ModeIndex((string?)template.Attribute("mode")); var priority = (string?)template.Attribute("priority"); foreach (var alternative in Alternatives(XPathParser.Parse(match), template)) { @@ -394,6 +468,56 @@ private void CompileTemplate(XElement template, int index) } } + private static string ModeKey(int mode) => mode.ToString(System.Globalization.CultureInfo.InvariantCulture); + + private Context TemplateContext(XElement element, Focus focus, Purity purity, Scope scope) => + new Context("n0", NodeKind.Object, "p0", "s0", focus, "n0", NodeKind.Object, focus, scope, element, locals, purity); + + /// The type of a parameter of a named template: that of every value it is given, if they have the same. + private XType ParameterType(NamedTemplate template, string parameter) + { + if (template.Matches) + return XType.Any; + return facts.ParameterTypes.TryGetValue(Facts.Parameter(template.Name, parameter), out var type) ? type : XType.None; + } + + /// + /// The call of a named template, which is given the context node, its position and its size only if it reads them. + /// + private string Call(NamedTemplate template, Context context, IEnumerable arguments) + { + if (facts.Impure.Contains(template.Name)) + context.Purity.Impure = true; + var node = facts.NodeUsed.Contains(template.Name) ? context.Node : "null"; + var position = facts.PositionUsed.Contains(template.Name) ? context.Position : "0"; + var size = facts.SizeUsed.Contains(template.Name) ? context.Size : "0"; + return template.Method + "(" + node + ", " + position + ", " + size + string.Concat(arguments.Select(a => ", " + a)) + ");"; + } + + /// The value as a parameter of the type takes it. + private static string Convert(Compiled value, XType type) + { + switch (type) + { + case XType.Any: + case XType.None: + return XPathCompiler.Box(value); + case var _ when type == value.Type: + return value.Code; + // no value of another type reaches a parameter whose type is known + case XType.Number: + return "0D"; + case XType.Boolean: + return "false"; + case XType.NodeSet: + return "Empty"; + case XType.Fragment: + return "null!"; + default: + return "\"\""; + } + } + private static IEnumerable Alternatives(Expr pattern, XElement template) { switch (pattern) @@ -425,38 +549,184 @@ private static double DefaultPriority(PathExpr alternative, List st } } - private void CompileBody(XElement template, List parameters, System.Func argument, CodeWriter w) + private void CompileBody(XElement template, List parameters, System.Func argument, System.Func type, NamedTemplate? named, + Focus focus, Purity purity, CodeWriter w) { var scope = new Scope(null); - var context = new Context("n0", "p0", "s0", "n0", scope, template); + var context = TemplateContext(template, focus, purity, scope); for (var i = 0; i < parameters.Count; i++) { var parameter = parameters[i]; + var name = Attr(parameter, "name", true)!; var id = NewName("v"); var paramContext = context.WithElement(parameter); var select = Attr(parameter, "select", false); + var content = select == null && HasContent(parameter); + var valueType = type(i) == XType.Number || type(i) == XType.Boolean; + + // the default is one of the values of the parameter if a call leaves the parameter to it + void Default(XType defaultType) + { + if (named != null && facts.Omitted.Contains(Facts.Parameter(named.Name, name))) + Learnt.Give(Facts.Parameter(named.Name, name), defaultType); + } + if (select != null) { - w.Line("var " + id + " = " + argument(i) + " ?? " + XPathCompiler.Box(xpath.Compile(select, paramContext)) + ";"); + var value = xpath.Compile(select, paramContext); + Default(value.Type); + w.Line("var " + id + " = " + argument(i) + " ?? " + Convert(value, type(i)) + ";"); } - else if (HasContent(parameter)) + else if (content && !valueType) { w.Line("var " + id + " = " + argument(i) + ";"); w.Open("if (" + id + " == null)"); - w.Line("output.BeginCapture();"); - CompileSequence(parameter.Nodes(), paramContext, w); - w.Line(id + " = output.EndFragment();"); + var value = Capture(parameter, paramContext, w); + Default(value.Type); + w.Line(id + " = " + Convert(value, type(i)) + ";"); w.Close(); } else { - w.Line("var " + id + " = " + argument(i) + " ?? \"\";"); + Default(content ? XType.Fragment : XType.String); + w.Line("var " + id + " = " + argument(i) + " ?? " + Convert(new Compiled("\"\"", XType.String), type(i)) + ";"); } - scope.Add(Attr(parameter, "name", true)!, new Variable(id, XType.Any)); + scope.Add(name, new Variable(id, type(i))); } CompileSequence(template.Nodes().Where(n => !(n is XElement e && parameters.Contains(e))), context, w); } + /// + /// Whether the instructions write only text, so that what they write can be kept as a string: no element, no + /// text written as markup, no template applied, and only named templates that write text called. + /// + private bool IsTextOnly(IEnumerable nodes) + { + foreach (var element in nodes.OfType()) + { + if (element.Name.Namespace != Xsl) + return false; + switch (element.Name.LocalName) + { + case "text": + case "value-of": + if (DisablesEscaping(element)) + return false; + break; + case "variable": + case "param": + case "message": + case "fallback": + break; + case "if": + case "choose": + case "when": + case "otherwise": + case "for-each": + if (!IsTextOnly(element.Nodes())) + return false; + break; + case "call-template": + if (facts.NotText.Contains((string?)element.Attribute("name") ?? "")) + return false; + break; + default: + return false; + } + } + return true; + } + + /// + /// What the instructions write as a C# expression of a string, if they are only text, values and choices + /// between them: null if they need statements. + /// + private string? TextExpression(IEnumerable nodes, Context context) + { + var parts = new List(); + foreach (var node in nodes) + { + switch (node) + { + case XText text when text.Value.Trim().Length == 0: + break; + case XText text: + parts.Add(XPathCompiler.Literal(text.Value)); + break; + case XElement element when element.Name == Xsl + "text" && !DisablesEscaping(element): + if (element.Value.Length > 0) + parts.Add(XPathCompiler.Literal(element.Value)); + break; + case XElement element when element.Name == Xsl + "value-of" && !DisablesEscaping(element) && element.Attribute("select") != null: + parts.Add(XPathCompiler.Str(xpath.Compile(Attr(element, "select", true)!, context.WithElement(element)))); + break; + case XElement element when element.Name == Xsl + "if" && element.Attribute("test") != null: + { + var then = TextExpression(element.Nodes(), context.WithElement(element)); + if (then == null) + return null; + parts.Add("(" + XPathCompiler.Bool(xpath.Compile(Attr(element, "test", true)!, context.WithElement(element))) + " ? " + then + " : \"\")"); + break; + } + case XElement element when element.Name == Xsl + "choose": + { + var choice = new StringBuilder(); + var otherwise = "\"\""; + foreach (var branch in element.Elements()) + { + var value = TextExpression(branch.Nodes(), context.WithElement(branch)); + if (value == null) + return null; + if (branch.Name == Xsl + "when" && branch.Attribute("test") != null) + choice.Append(XPathCompiler.Bool(xpath.Compile(Attr(branch, "test", true)!, context.WithElement(branch)))).Append(" ? ").Append(value).Append(" : "); + else if (branch.Name == Xsl + "otherwise" && branch == element.Elements().Last()) + otherwise = value; + else + return null; + } + parts.Add("(" + choice + otherwise + ")"); + break; + } + case XElement _: + return null; + } + } + switch (parts.Count) + { + case 0: + return "\"\""; + case 1: + return parts[0]; + default: + return "string.Concat(" + string.Join(", ", parts) + ")"; + } + } + + /// + /// The content of a variable or parameter as its value: a string when it only writes text, a result tree + /// fragment otherwise. + /// + private Compiled Capture(XElement element, Context context, CodeWriter w) + { + if (!IsTextOnly(element.Nodes())) + { + var fragment = NewName("f"); + w.Line("output.BeginCapture();"); + CompileSequence(element.Nodes(), context, w); + w.Line("var " + fragment + " = output.EndFragment();"); + return new Compiled(fragment, XType.Fragment); + } + + var expression = TextExpression(element.Nodes(), context); + if (expression != null) + return new Compiled(expression, XType.Text); + var text = NewName("t"); + w.Line("output.BeginText();"); + CompileSequence(element.Nodes(), context, w); + w.Line("var " + text + " = output.EndText();"); + return new Compiled(text, XType.Text); + } + private static bool HasContent(XElement element) => element.Nodes().Any(n => n is XElement || (n is XText t && t.Value.Trim().Length > 0)); @@ -465,7 +735,6 @@ private static bool HasContent(XElement element) => private void CompileMatch(Rule rule) { var w = new CodeWriter(2); - var context = new Context("node", "1", "1", "node", new Scope(null), rule.Template); if (rule.IsRoot) { w.Line().Line("private static bool Match" + rule.Index + "(XObject node) => node is XDocument;"); @@ -476,19 +745,13 @@ private void CompileMatch(Rule rule) for (var i = 0; i < rule.Steps.Count; i++) { var step = rule.Steps[i].Step; - var attributeAxis = step.Axis == "attribute"; - var test = NodeTest(step.Test, rule.Template) + ".Matches(node, " + (attributeAxis ? "true" : "false") + ")"; - if (step.Predicates.Count > 0) - { - if (step.Predicates.Any(p => xpath.IsPositional(p, context))) - test = "MatchesStep(node, Axis." + (attributeAxis ? "Attribute" : "Child") + ", " + NodeTest(step.Test, rule.Template) + ", " - + string.Join(", ", step.Predicates.Select(p => xpath.Predicate(p, context))) + ")"; - else - test += string.Concat(step.Predicates.Select(p => " && " + XPathCompiler.Bool(xpath.Compile(p, context)))); - } + var focus = new Focus(); + var context = new Context("node", NodeKind.Object, null, null, focus, "node", NodeKind.Object, focus, new Scope(null), rule.Template, new Names(), new Purity()); + var test = MatchStep(step, context); w.Line().Open("private bool Match" + rule.Index + "_" + i + "(XObject node)"); - w.Line("if (!(" + test + "))").Line(" return false;"); + if (test != null) + w.Line("if (!(" + test + "))").Line(" return false;"); if (i == 0) { w.Line(rule.Absolute ? "return Parent(node) is XDocument;" : "return true;"); @@ -508,6 +771,67 @@ private void CompileMatch(Rule rule) } w.Line().Line("private bool Match" + rule.Index + "(XObject node) => Match" + rule.Index + "_" + (rule.Steps.Count - 1) + "(node);"); members.Append(w); + + var last = rule.Last!; + if (rule.Steps.Count == 1 && !rule.Absolute && last.Predicates.Count == 0) + { + switch (last.Test.Kind) + { + case TestKind.AnyName: + case TestKind.Node: + rule.Always = true; + break; + case TestKind.Namespace: + break; + case TestKind.ProcessingInstruction: + rule.Always = last.Test.Local == null; + break; + default: + rule.Always = last.Axis != "attribute"; + break; + } + } + } + + /// + /// Whether the node, node in the generated code, is one the step of a pattern selects from its parent: the + /// C# condition, or null if every node is. + /// + private string? MatchStep(Step step, Context context) + { + var attributeAxis = step.Axis == "attribute"; + if (step.Predicates.Any(p => xpath.IsPositional(p, context))) + { + // the predicates count the node among those the step selects from its parent + var body = new CodeWriter(3); + body.Line("var parent = Parent(node);").Line("if (parent == null)").Line(" return false;"); + xpath.EmitStep(new Cursor("parent", NodeKind.Object), step, context, body, + cursor => body.Line("if (ReferenceEquals(" + cursor.Var + ", node))").Line(" return true;")); + body.Line("return false;"); + return HelperMethod("bool", "XObject node", body.ToString()) + "(node)"; + } + + XPathCompiler.Tested tested; + string? condition; + if (attributeAxis) + { + var attribute = context.Names.New("a_"); + tested = xpath.Test(step.Test, true, new Cursor(attribute, NodeKind.Attribute), false, context); + condition = "node is XAttribute " + attribute + (tested.Condition == null ? "" : " && " + tested.Condition); + } + else + { + tested = xpath.Test(step.Test, false, new Cursor("node", NodeKind.Object), false, context); + condition = tested.Condition; + } + if (tested.Never) + return "false"; + foreach (var predicate in step.Predicates) + { + var value = XPathCompiler.Bool(xpath.Compile(predicate, context.WithFocus(tested.Cursor.Var, tested.Cursor.Kind, null, null, new Focus()))); + condition = condition == null ? value : condition + " && " + value; + } + return condition; } private static Bucket[] Buckets(Rule rule) @@ -540,12 +864,30 @@ private void CompileDispatch(int mode) // the rule that wins is the one of highest priority and, among those, the last in the stylesheet var ordered = rules.Where(r => r.Mode == mode).OrderByDescending(r => r.Priority).ThenByDescending(r => r.Index).ToList(); List In(Bucket bucket) => ordered.Where(r => Buckets(r).Contains(bucket)).ToList(); + var position = facts.ModePosition.Contains(ModeKey(mode)); + var size = facts.ModeSize.Contains(ModeKey(mode)); var w = new CodeWriter(2); w.Line().Open("private void Apply" + mode + "(List nodes, TemplateArguments? args)"); w.Line("for (var i = 0; i < nodes.Count; i++)").Line(" Dispatch" + mode + "(nodes[i], i + 1, nodes.Count, args);"); w.Close(); + // the children of a node, without a list of them unless a template reads how many they are + w.Line().Open("private void ApplyChildren" + mode + "(XObject node, TemplateArguments? args)"); + if (size) + { + w.Line("Apply" + mode + "(ChildNodes(node), args);"); + } + else + { + if (position) + w.Line("var position = 0;"); + w.Open("for (var child = FirstChild(node); child != null; child = child.NextNode)"); + w.Line("if (IsNode(child))").Line(" Dispatch" + mode + "(child, " + (position ? "++position" : "0") + ", 0, args);"); + w.Close(); + } + w.Close(); + w.Line().Open("private void Dispatch" + mode + "(XObject node, int position, int size, TemplateArguments? args)"); w.Open("switch (node)"); @@ -580,11 +922,11 @@ private void CompileDispatch(int mode) { EmitCandidates(generic, w); } - w.Line("Apply" + mode + "(ChildNodes(node), null);").Line("return;").Close(); + w.Line("ApplyChildren" + mode + "(node, null);").Line("return;").Close(); w.Line("case XDocument _:").Open(); EmitCandidates(In(Bucket.Root), w); - w.Line("Apply" + mode + "(ChildNodes(node), null);").Line("return;").Close(); + w.Line("ApplyChildren" + mode + "(node, null);").Line("return;").Close(); w.Line("case XAttribute _:").Open(); EmitCandidates(In(Bucket.Attribute), w); @@ -610,6 +952,11 @@ private static void EmitCandidates(IEnumerable candidates, CodeWriter w) { foreach (var rule in candidates) { + if (rule.Always) + { + w.Line(rule.Method + "(node, position, size, args);").Line("return;"); + return; + } w.Open("if (Match" + rule.Index + "(node))"); w.Line(rule.Method + "(node, position, size, args);").Line("return;"); w.Close(); @@ -618,10 +965,12 @@ private static void EmitCandidates(IEnumerable candidates, CodeWriter w) // global variables and parameters - public Variable? Global(string name) + public Variable? Global(string name, Purity purity) { if (!globals.TryGetValue(name, out var global)) return null; + if (facts.Dynamic.Contains(name)) + purity.Impure = true; if (global.Variable != null) return global.Variable; if (global.Compiling) @@ -630,49 +979,62 @@ private static void EmitCandidates(IEnumerable candidates, CodeWriter w) var id = "G" + NewName("_"); var element = global.Element; - var context = new Context("n0", "p0", "s0", "n0", new Scope(null), element); - var w = new CodeWriter(2); + var focus = new Focus(); + var own = new Purity(); + var context = TemplateContext(element, focus, own, new Scope(null)); + var body = new CodeWriter(3); var select = Attr(element, "select", false); - XType type; - w.Line(); + Compiled value; + var order = NodeOrder.Ordered; if (select != null) { - var value = xpath.Compile(select, context); - type = value.Type; - w.Open("private " + XPathCompiler.TypeName(type) + " Compute" + id + "()"); - w.Line("XObject n0 = root;").Line("const int p0 = 1, s0 = 1;"); - w.Line("return " + value.Code + ";"); + var expr = XPathParser.Parse(select); + value = xpath.Compile(expr, context); + if (value.Type == XType.NodeSet) + order = xpath.OrderOf(expr, context); } else if (HasContent(element)) { - type = XType.Fragment; - w.Open("private ResultFragment Compute" + id + "()"); - w.Line("XObject n0 = root;").Line("const int p0 = 1, s0 = 1;"); - w.Line("output.BeginCapture();"); - CompileSequence(element.Nodes(), context, w); - w.Line("return output.EndFragment();"); + value = Capture(element, context, body); } else { - type = XType.String; - w.Open("private string Compute" + id + "()"); - w.Line("return \"\";"); + value = new Compiled("\"\"", XType.String); } + var type = value.Type; + var typeName = XPathCompiler.TypeName(type); + body.Line("return " + value.Code + ";"); + + var w = new CodeWriter(2); + w.Line().Open("private " + typeName + " Compute" + id + "()"); + w.Line("XObject n0 = root;").Line("const int p0 = 1, s0 = 1;"); + w.Raw(body.ToString()); w.Close(); - var typeName = XPathCompiler.TypeName(type); - instanceFields.Line("private bool " + id + "Done;").Line("private " + typeName + " " + id + "Value = default!;"); - w.Line().Open("private " + typeName + " " + id) - .Open("get") - .Open("if (!" + id + "Done)") - .Line(id + "Value = Compute" + id + "();") - .Line(id + "Done = true;") - .Close() - .Line("return " + id + "Value;") - .Close() - .Close(); + // a string that does not depend on the input is computed once for all + var text = type == XType.String || type == XType.Text; + if (own.Impure || focus.NodeUsed || focus.CurrentUsed || !text) + Learnt.Dynamic.Add(name); + if (text && !facts.Dynamic.Contains(name)) + { + staticFields.Line("private static string? " + id + "Value;"); + w.Line().Line("private string " + id + " => " + id + "Value ??= Compute" + id + "();"); + } + else + { + instanceFields.Line("private bool " + id + "Done;").Line("private " + typeName + " " + id + "Value = default!;"); + w.Line().Open("private " + typeName + " " + id) + .Open("get") + .Open("if (!" + id + "Done)") + .Line(id + "Value = Compute" + id + "();") + .Line(id + "Done = true;") + .Close() + .Line("return " + id + "Value;") + .Close() + .Close(); + } members.Append(w); - global.Variable = new Variable(id, type); + global.Variable = new Variable(id, type, order); return global.Variable; } @@ -736,16 +1098,38 @@ private void CompileInstruction(XElement element, Context context, CodeWriter w) case "apply-templates": { var select = Attr(element, "select", false); - var nodes = select == null ? "ChildNodes(" + context.Node + ")" : XPathCompiler.Nodes(xpath.Compile(select, context)); + var mode = ModeIndex((string?)element.Attribute("mode")); + context.Purity.Impure = true; var args = "null"; var parameters = WithParameters(element, context, w); if (parameters.Count > 0) { args = NewName("args"); w.Line("var " + args + " = new TemplateArguments(new[] { " + string.Join(", ", parameters.Keys.Select(XPathCompiler.Literal)) - + " }, new object[] { " + string.Join(", ", parameters.Values) + " });"); + + " }, new object[] { " + string.Join(", ", parameters.Values.Select(XPathCompiler.Box)) + " });"); } - w.Line("Apply" + ModeIndex((string?)element.Attribute("mode")) + "(" + nodes + ", " + args + ");"); + if (select == null) + { + w.Line("ApplyChildren" + mode + "(" + context.Node + ", " + args + ");"); + break; + } + + // the templates are given the position of each node, and a list of the nodes for their number, + // only if one of the mode reads them + var expr = XPathParser.Parse(select); + if (facts.ModeSize.Contains(ModeKey(mode)) || !XPathCompiler.IsStreamed(xpath.OrderOf(expr, context))) + { + w.Line("Apply" + mode + "(" + xpath.NodesCode(expr, context) + ", " + args + ");"); + break; + } + var position = "0"; + if (facts.ModePosition.Contains(ModeKey(mode))) + { + var p = NewName("p"); + w.Line("var " + p + " = 0;"); + position = "++" + p; + } + xpath.EmitNodes(expr, context, w, cursor => w.Line("Dispatch" + mode + "(" + cursor.Var + ", " + position + ", 0, " + args + ");")); break; } case "call-template": @@ -754,8 +1138,22 @@ private void CompileInstruction(XElement element, Context context, CodeWriter w) if (!namedTemplates.TryGetValue(name, out var template)) throw Error(element, "There is no template named " + name + "."); var parameters = WithParameters(element, context, w); - var args = string.Concat(template.Parameters.Select(p => ", " + (parameters.TryGetValue(p, out var value) ? value : "null"))); - w.Line(template.Method + "(" + context.Node + ", " + context.Position + ", " + context.Size + args + ");"); + var args = new List(); + foreach (var parameter in template.Parameters) + { + var key = Facts.Parameter(name, parameter); + if (parameters.TryGetValue(parameter, out var value)) + { + Learnt.Give(key, value.Type); + args.Add(Convert(value, ParameterType(template, parameter))); + } + else + { + Learnt.Omitted.Add(key); + args.Add("null"); + } + } + w.Line(Call(template, context, args)); break; } case "value-of": @@ -803,15 +1201,39 @@ private void CompileInstruction(XElement element, Context context, CodeWriter w) { if (element.Elements(Xsl + "sort").Any()) throw Error(element, "xsl:sort is not supported."); - var set = NewName("set"); - var i = NewName("i"); + var expr = XPathParser.Parse(Attr(element, "select", true)!); + var kind = xpath.KindOf(expr, context); var n = NewName("n"); var p = NewName("p"); var s = NewName("s"); - w.Line("var " + set + " = " + XPathCompiler.Nodes(xpath.Compile(Attr(element, "select", true)!, context)) + ";"); + + // the content first: whether it reads the position and the number of the nodes tells the loop it needs + var focus = new Focus(); + var body = new CodeWriter(); + CompileSequence(element.Nodes(), new Context(n, kind, p, s, focus, n, kind, focus, context.Scope, element, context.Names, context.Purity), body); + if (!focus.SizeUsed && XPathCompiler.IsStreamed(xpath.OrderOf(expr, context))) + { + if (focus.PositionUsed) + w.Line("var " + p + " = 0;"); + xpath.EmitNodes(expr, context, w, cursor => + { + w.Line("var " + n + " = " + cursor.Var + ";"); + if (focus.PositionUsed) + w.Line(p + "++;"); + w.Indented(body); + }); + break; + } + var set = NewName("set"); + var i = NewName("i"); + w.Line("var " + set + " = " + xpath.NodesCode(expr, context) + ";"); w.Open("for (var " + i + " = 0; " + i + " < " + set + ".Count; " + i + "++)"); - w.Line("var " + n + " = " + set + "[" + i + "];").Line("var " + p + " = " + i + " + 1;").Line("var " + s + " = " + set + ".Count;"); - CompileSequence(element.Nodes(), new Context(n, p, s, n, context.Scope, element), w); + w.Line("var " + n + " = " + (kind == NodeKind.Object ? "" : "(" + XPathCompiler.TypeName(kind) + ")") + set + "[" + i + "];"); + if (focus.PositionUsed) + w.Line("var " + p + " = " + i + " + 1;"); + if (focus.SizeUsed) + w.Line("var " + s + " = " + set + ".Count;"); + w.Indented(body); w.Close(); break; } @@ -820,26 +1242,25 @@ private void CompileInstruction(XElement element, Context context, CodeWriter w) var name = Attr(element, "name", true)!; var id = NewName("v"); var select = Attr(element, "select", false); - XType type; + Compiled value; + var order = NodeOrder.Ordered; if (select != null) { - var value = xpath.Compile(select, context); - type = value.Type; - w.Line("var " + id + " = " + value.Code + ";"); + var expr = XPathParser.Parse(select); + value = xpath.Compile(expr, context); + if (value.Type == XType.NodeSet) + order = xpath.OrderOf(expr, context); } else if (HasContent(element)) { - type = XType.Fragment; - w.Line("output.BeginCapture();"); - CompileSequence(element.Nodes(), context, w); - w.Line("var " + id + " = output.EndFragment();"); + value = Capture(element, context, w); } else { - type = XType.String; - w.Line("var " + id + " = \"\";"); + value = new Compiled("\"\"", XType.String); } - context.Scope.Add(name, new Variable(id, type)); + w.Line("var " + id + " = " + value.Code + ";"); + context.Scope.Add(name, new Variable(id, value.Type, order)); break; } case "attribute": @@ -859,9 +1280,24 @@ private void CompileInstruction(XElement element, Context context, CodeWriter w) } case "copy-of": { - var value = xpath.Compile(Attr(element, "select", true)!, context); - var code = value.Type == XType.Number || value.Type == XType.Boolean ? XPathCompiler.Str(value) : value.Code; - w.Line("output.CopyOf(" + code + ");"); + var expr = XPathParser.Parse(Attr(element, "select", true)!); + var value = xpath.Compile(expr, context); + switch (value.Type) + { + case XType.NodeSet when XPathCompiler.IsStreamed(xpath.OrderOf(expr, context)): + xpath.EmitNodes(expr, context, w, cursor => w.Line("output.Copy(" + cursor.Var + ");")); + break; + case XType.Text: + w.Line("output.CopyOfText(" + value.Code + ");"); + break; + case XType.Number: + case XType.Boolean: + w.Line("output.CopyOf(" + XPathCompiler.Str(value) + ");"); + break; + default: + w.Line("output.CopyOf(" + value.Code + ");"); + break; + } break; } case "copy": @@ -898,10 +1334,10 @@ private void CompileInstruction(XElement element, Context context, CodeWriter w) private static bool DisablesEscaping(XElement element) => (string?)element.Attribute("disable-output-escaping") == "yes"; - /// The parameters of xsl:apply-templates or xsl:call-template, by name, as C# expressions of type object. - private Dictionary WithParameters(XElement element, Context context, CodeWriter w) + /// The parameters of xsl:apply-templates or xsl:call-template, by name. + private Dictionary WithParameters(XElement element, Context context, CodeWriter w) { - var parameters = new Dictionary(); + var parameters = new Dictionary(); foreach (var child in element.Elements()) { if (child.Name == Xsl + "sort") @@ -913,19 +1349,17 @@ private Dictionary WithParameters(XElement element, Context cont var paramContext = context.WithElement(child); if (select != null) { - parameters[name] = XPathCompiler.Box(xpath.Compile(select, paramContext)); + // compiled here, before the statements of the parameters after it + var value = xpath.Compile(select, paramContext); + parameters[name] = value.IsNodeSet ? new Compiled(value.Code, XType.NodeSet) : value; } else if (HasContent(child)) { - var id = NewName("w"); - w.Line("output.BeginCapture();"); - CompileSequence(child.Nodes(), paramContext, w); - w.Line("var " + id + " = output.EndFragment();"); - parameters[name] = id; + parameters[name] = Capture(child, paramContext, w); } else { - parameters[name] = "(object)\"\""; + parameters[name] = new Compiled("\"\"", XType.String); } } return parameters; @@ -946,6 +1380,8 @@ private string Content(XElement element, Context context, CodeWriter w) case 1 when nodes[0] is XElement e && e.Name == Xsl + "value-of": return XPathCompiler.Str(xpath.Compile(Attr(e, "select", true)!, context.WithElement(e))); } + if (IsTextOnly(element.Nodes())) + return Capture(element, context, w).Code; var id = NewName("text"); w.Line("output.BeginCapture();"); CompileSequence(element.Nodes(), context, w); diff --git a/src/SharpEquations.XsltGenerator/XPathCompiler.cs b/src/SharpEquations.XsltGenerator/XPathCompiler.cs index 527508e..6ae2ce8 100644 --- a/src/SharpEquations.XsltGenerator/XPathCompiler.cs +++ b/src/SharpEquations.XsltGenerator/XPathCompiler.cs @@ -6,44 +6,119 @@ namespace SharpEquations.XsltGenerator using System.Text; using System.Xml.Linq; - /// The static type of an XPath value in the generated code. + /// + /// The static type of an XPath value in the generated code. Text is a result tree fragment that holds only + /// text, kept as a string; None is the type of a parameter no call has given a value yet, while the types + /// of the parameters are inferred. + /// internal enum XType { + None, String, Number, Boolean, NodeSet, + Text, Fragment, Any, } + /// What is known of the order of the nodes a path yields as the generated loops reach them. + internal enum NodeOrder + { + /// At most one node. + Single, + + /// In document order, without duplicates, none an ancestor of another. + Disjoint, + + /// In document order, without duplicates. + Ordered, + + /// In reverse document order, without duplicates. + Reversed, + + Unordered, + } + + /// The C# type of the variable that holds a node. + internal enum NodeKind + { + Object, + Node, + Element, + Attribute, + Text, + } + + /// A node the generated code holds in a variable. + internal readonly struct Cursor + { + public Cursor(string variable, NodeKind kind) + { + Var = variable; + Kind = kind; + } + + public string Var { get; } + + public NodeKind Kind { get; } + } + + /// + /// An expression compiled to C#. A node-set is compiled when it is used, to the code its use needs: a test for a + /// node, the string value of the first one, a count, or the list of the nodes (). + /// internal sealed class Compiled { + private readonly XPathCompiler? owner; + private string? code; + public Compiled(string code, XType type) { - Code = code; + this.code = code; Type = type; } - public string Code { get; } + public Compiled(XPathCompiler owner, Expr expr, Context context) + { + this.owner = owner; + Expr = expr; + Context = context; + Type = XType.NodeSet; + } + + public string Code => code ??= owner!.NodesCode(Expr!, Context!); public XType Type { get; } + + public Expr? Expr { get; } + + public Context? Context { get; } + + public XPathCompiler Owner => owner!; + + public bool IsNodeSet => Expr != null; } internal sealed class Variable { - public Variable(string id, XType type) + public Variable(string id, XType type, NodeOrder order = NodeOrder.Ordered) { Id = id; Type = type; + Order = order; } public string Id { get; } public XType Type { get; } + + /// The order of the nodes of a node-set. + public NodeOrder Order { get; } } - internal sealed class Scope + internal class Scope { private readonly Dictionary variables = new Dictionary(); private readonly Scope? parent; @@ -52,46 +127,146 @@ internal sealed class Scope public void Add(string name, Variable variable) => variables[name] = variable; - public Variable? Find(string name) => + public virtual Variable? Find(string name) => variables.TryGetValue(name, out var variable) ? variable : parent?.Find(name); } + /// The scope of a method generated for an expression: the variables it reads are its parameters. + internal sealed class CapturingScope : Scope + { + private readonly Scope outer; + + public CapturingScope(Scope outer) + : base(null) => this.outer = outer; + + public List Captured { get; } = new List(); + + public override Variable? Find(string name) + { + var variable = outer.Find(name); + if (variable != null && !Captured.Contains(variable)) + Captured.Add(variable); + return variable; + } + } + + /// What the code compiled in a context read of it. + internal sealed class Focus + { + public bool NodeUsed { get; set; } + + public bool PositionUsed { get; set; } + + public bool SizeUsed { get; set; } + + public bool CurrentUsed { get; set; } + } + + /// Whether what is compiled depends on more than its parameters: the input, or a variable that does. + internal sealed class Purity + { + public bool Impure { get; set; } + } + + internal sealed class Names + { + private int counter; + + public string New(string prefix) => prefix + (++counter).ToString(CultureInfo.InvariantCulture); + } + /// /// Where an expression is evaluated: the C# names of the context node, position and size, and of the current /// node of XSLT; the variables in scope; the element whose namespace declarations resolve its prefixes. /// internal sealed class Context { - public Context(string node, string position, string size, string current, Scope scope, XElement element) + private readonly string node; + private readonly string? position; + private readonly string? size; + private readonly string current; + private readonly Focus focus; + private readonly Focus currentFocus; + + public Context(string node, NodeKind nodeKind, string? position, string? size, Focus focus, string current, NodeKind currentKind, Focus currentFocus, + Scope scope, XElement element, Names names, Purity purity) { - Node = node; - Position = position; - Size = size; - Current = current; + this.node = node; + NodeKind = nodeKind; + this.position = position; + this.size = size; + this.focus = focus; + this.current = current; + CurrentKind = currentKind; + this.currentFocus = currentFocus; Scope = scope; Element = element; + Names = names; + Purity = purity; + } + + public string Node + { + get + { + focus.NodeUsed = true; + return node; + } } - public string Node { get; } + public NodeKind NodeKind { get; } + + public string Position + { + get + { + focus.PositionUsed = true; + return position ?? throw new XsltException("The position of the context is not known here."); + } + } - public string Position { get; } + public string Size + { + get + { + focus.SizeUsed = true; + return size ?? throw new XsltException("The size of the context is not known here."); + } + } - public string Size { get; } + public string Current + { + get + { + currentFocus.CurrentUsed = true; + return current; + } + } - public string Current { get; } + public NodeKind CurrentKind { get; } public Scope Scope { get; } public XElement Element { get; } - public Context WithFocus(string node, string position, string size) => new Context(node, position, size, Current, Scope, Element); + public Names Names { get; } + + public Purity Purity { get; } + + public Context WithFocus(string node, NodeKind kind, string? position, string? size, Focus focus) => + new Context(node, kind, position, size, focus, current, CurrentKind, currentFocus, Scope, Element, Names, Purity); - public Context WithScope(Scope scope) => new Context(Node, Position, Size, Current, scope, Element); + public Context WithScope(Scope scope) => + new Context(node, NodeKind, position, size, focus, current, CurrentKind, currentFocus, scope, Element, Names, Purity); - public Context WithElement(XElement element) => new Context(Node, Position, Size, Current, Scope, element); + public Context WithElement(XElement element) => + new Context(node, NodeKind, position, size, focus, current, CurrentKind, currentFocus, Scope, element, Names, Purity); } - /// XPath 1.0 expressions compiled to C# expressions over XPathFunctions. + /// + /// XPath 1.0 expressions compiled to C#: the values as expressions over XPathFunctions, the location paths + /// as loops over the nodes, in the method that uses them or in a method of their own. + /// internal sealed class XPathCompiler { private readonly StylesheetCompiler stylesheet; @@ -110,30 +285,89 @@ public Compiled Compile(Expr expr, Context context) return new Compiled(Number(number.Value), XType.Number); case VariableExpr variable: { - var found = context.Scope.Find(variable.Name) ?? stylesheet.Global(variable.Name) - ?? throw new XsltException("The variable $" + variable.Name + " is not declared."); - return new Compiled(found.Id, found.Type); + var found = Find(variable, context); + return found.Type == XType.NodeSet ? new Compiled(this, expr, context) : new Compiled(found.Id, found.Type); } case NegateExpr negate: return new Compiled("(-" + Num(Compile(negate.Operand, context)) + ")", XType.Number); + case BinaryExpr union when union.Op == "|": + return new Compiled(this, expr, context); case BinaryExpr binary: return CompileBinary(binary, context); + case FunctionExpr function when function.Name == "current": + if (function.Arguments.Count != 0) + throw new XsltException("Wrong number of arguments to current()."); + return new Compiled(this, expr, context); case FunctionExpr function: return CompileFunction(function, context); - case FilterExpr filter: - { - var code = Nodes(Compile(filter.Primary, context)); - foreach (var predicate in filter.Predicates) - code = "Filter(" + code + ", " + Predicate(predicate, context) + ")"; - return new Compiled(code, XType.NodeSet); - } - case PathExpr path: - return CompilePath(path, context); + case FilterExpr _: + case PathExpr _: + return new Compiled(this, expr, context); default: throw new XsltException("Unknown expression."); } } + private Variable Find(VariableExpr variable, Context context) => + context.Scope.Find(variable.Name) ?? stylesheet.Global(variable.Name, context.Purity) + ?? throw new XsltException("The variable $" + variable.Name + " is not declared."); + + /// The type of the value of an expression, without compiling it. + public XType TypeOf(Expr expr, Context context) + { + switch (expr) + { + case LiteralExpr _: + return XType.String; + case NumberExpr _: + case NegateExpr _: + return XType.Number; + case VariableExpr variable: + return Find(variable, context).Type; + case BinaryExpr binary: + switch (binary.Op) + { + case "|": + return XType.NodeSet; + case "+": + case "-": + case "*": + case "div": + case "mod": + return XType.Number; + default: + return XType.Boolean; + } + case FunctionExpr function: + switch (function.Name) + { + case "last": + case "position": + case "count": + case "sum": + case "string-length": + case "number": + case "floor": + case "ceiling": + case "round": + return XType.Number; + case "starts-with": + case "contains": + case "boolean": + case "not": + case "true": + case "false": + return XType.Boolean; + case "current": + return XType.NodeSet; + default: + return XType.String; + } + default: + return XType.NodeSet; + } + } + private Compiled CompileBinary(BinaryExpr binary, Context context) { var left = Compile(binary.Left, context); @@ -152,18 +386,20 @@ private Compiled CompileBinary(BinaryExpr binary, Context context) return new Compiled("(" + Num(left) + " / " + Num(right) + ")", XType.Number); case "mod": return new Compiled("(" + Num(left) + " % " + Num(right) + ")", XType.Number); - case "|": - return new Compiled("Union(" + Nodes(left) + ", " + Nodes(right) + ")", XType.NodeSet); default: return CompileComparison(binary.Op, left, right); } } - private static bool IsNodes(XType type) => type == XType.NodeSet || type == XType.Fragment || type == XType.Any; + private static bool IsUnknown(XType type) => type == XType.Any || type == XType.None; - private static Compiled CompileComparison(string op, Compiled left, Compiled right) + private Compiled CompileComparison(string op, Compiled left, Compiled right) { - if (IsNodes(left.Type) || IsNodes(right.Type)) + if (left.IsNodeSet && !right.IsNodeSet && !IsUnknown(right.Type)) + return new Compiled(CompareNodes(left, op, right, false), XType.Boolean); + if (right.IsNodeSet && !left.IsNodeSet && !IsUnknown(left.Type)) + return new Compiled(CompareNodes(right, op, left, true), XType.Boolean); + if (left.IsNodeSet || right.IsNodeSet || IsUnknown(left.Type) || IsUnknown(right.Type)) return new Compiled("Compare(" + Box(left) + ", " + Box(right) + ", Comparison." + ComparisonName(op) + ")", XType.Boolean); var csharp = op == "=" ? "==" : op; string code; @@ -178,6 +414,37 @@ private static Compiled CompileComparison(string op, Compiled left, Compiled rig return new Compiled(code, XType.Boolean); } + /// + /// A node-set compared with a value that is not one: whether a node compares so, by its string value (with a + /// boolean, the node-set as a boolean). + /// + private string CompareNodes(Compiled nodes, string op, Compiled other, bool swapped) + { + var csharp = op == "=" ? "==" : op; + var equality = op == "=" || op == "!="; + if (other.Type == XType.Boolean) + { + var exists = Bool(nodes); + if (equality) + return "(" + exists + " " + csharp + " " + other.Code + ")"; + var number = "(" + exists + " ? 1D : 0D)"; + var otherNumber = "(" + other.Code + " ? 1D : 0D)"; + return "(" + (swapped ? otherNumber + " " + csharp + " " + number : number + " " + csharp + " " + otherNumber) + ")"; + } + + var numeric = other.Type == XType.Number || !equality; + var argument = numeric ? Num(other) : Str(other); + return Helper("bool", nodes.Context!, (context, w) => + { + EmitNodes(nodes.Expr!, context, w, cursor => + { + var value = numeric ? "Num(" + StringValue(cursor) + ")" : StringValue(cursor); + w.Line("if (" + (swapped ? "o " + csharp + " " + value : value + " " + csharp + " o") + ")").Line(" return true;"); + }); + w.Line("return false;"); + }, numeric ? "double" : "string", argument); + } + private static string ComparisonName(string op) { switch (op) @@ -206,7 +473,7 @@ void Arity(int min, int max) throw new XsltException("Wrong number of arguments to " + function.Name + "()."); } - string StringArgument(int i) => args.Count > i ? Str(args[i]) : "StringValue(" + context.Node + ")"; + string StringArgument(int i) => args.Count > i ? Str(args[i]) : StringValue(new Cursor(context.Node, context.NodeKind)); switch (function.Name) { @@ -218,7 +485,7 @@ void Arity(int min, int max) return new Compiled("((double)" + context.Position + ")", XType.Number); case "count": Arity(1, 1); - return new Compiled("Count(" + Nodes(args[0]) + ")", XType.Number); + return new Compiled(args[0].IsNodeSet ? "((double)" + CountCode(args[0].Expr!, args[0].Context!) + ")" : "Count(" + Nodes(args[0]) + ")", XType.Number); case "sum": Arity(1, 1); return new Compiled("Sum(" + Nodes(args[0]) + ")", XType.Number); @@ -228,7 +495,14 @@ void Arity(int min, int max) { Arity(0, 1); var method = function.Name == "local-name" ? "LocalName" : function.Name == "name" ? "Name" : "NamespaceUri"; - return new Compiled(method + "(" + (args.Count == 0 ? context.Node : Nodes(args[0])) + ")", XType.String); + string node; + if (args.Count == 0) + node = context.Node; + else if (args[0].IsNodeSet) + node = FirstNodeCode(args[0].Expr!, args[0].Context!); + else + node = Nodes(args[0]); + return new Compiled(method + "(" + node + ")", XType.String); } case "string": Arity(0, 1); @@ -262,7 +536,7 @@ void Arity(int min, int max) Arity(3, 3); if (function.Arguments[1] is LiteralExpr from && function.Arguments[2] is LiteralExpr to) return new Compiled(stylesheet.StaticField("TranslateMap", "new TranslateMap(" + Literal(from.Value) + ", " + Literal(to.Value) + ")") + ".Apply(" + Str(args[0]) + ")", XType.String); - return new Compiled("Translate(" + Str(args[0]) + ", " + Str(args[1]) + ", " + Str(args[2]) + ", ref " + stylesheet.InstanceField("TranslateMap?") + ")", XType.String); + return new Compiled("Translate(" + Str(args[0]) + ", " + Str(args[1]) + ", " + Str(args[2]) + ", ref " + stylesheet.CacheField("TranslateMap?") + ")", XType.String); case "boolean": Arity(1, 1); return new Compiled(Bool(args[0]), XType.Boolean); @@ -277,7 +551,7 @@ void Arity(int min, int max) return new Compiled("false", XType.Boolean); case "number": Arity(0, 1); - return new Compiled(args.Count == 0 ? "Num(StringValue(" + context.Node + "))" : Num(args[0]), XType.Number); + return new Compiled(args.Count == 0 ? "Num(" + StringArgument(0) + ")" : Num(args[0]), XType.Number); case "floor": Arity(1, 1); return new Compiled("System.Math.Floor(" + Num(args[0]) + ")", XType.Number); @@ -287,105 +561,760 @@ void Arity(int min, int max) case "round": Arity(1, 1); return new Compiled("Round(" + Num(args[0]) + ")", XType.Number); - case "current": - Arity(0, 0); - return new Compiled("Single(" + context.Current + ")", XType.NodeSet); default: throw new XsltException("The function " + function.Name + "() is not supported."); } } - private Compiled CompilePath(PathExpr path, Context context) + // node-sets: what the use of one needs + + /// The list of the nodes, in document order. + public string NodesCode(Expr expr, Context context) { - string code; - if (path.Start != null) - code = Nodes(Compile(path.Start, context)); - else if (path.Absolute) - code = "Root(" + context.Node + ")"; - else - code = "Single(" + context.Node + ")"; + switch (expr) + { + case VariableExpr variable: + { + var found = Find(variable, context); + return found.Type == XType.NodeSet ? found.Id : Nodes(new Compiled(found.Id, found.Type)); + } + case BinaryExpr union when union.Op == "|": + return "Union(" + NodesCode(union.Left, context) + ", " + NodesCode(union.Right, context) + ")"; + case FilterExpr _: + case PathExpr _: + case FunctionExpr _ when IsCurrent(expr): + { + var order = OrderOf(expr, context); + return Helper("List", context, (inner, w) => + { + if (order == NodeOrder.Single) + { + EmitNodes(expr, inner, w, cursor => w.Line("return Single(" + cursor.Var + ");")); + w.Line("return Empty;"); + return; + } + w.Line("var list = new List();"); + EmitNodes(expr, inner, w, cursor => w.Line("list.Add(" + cursor.Var + ");")); + switch (order) + { + case NodeOrder.Reversed: + w.Line("list.Reverse();"); + break; + case NodeOrder.Unordered: + w.Line("SortUnique(list);"); + break; + } + w.Line("return list;"); + }); + } + default: + return Nodes(Compile(expr, context)); + } + } + + private static bool IsCurrent(Expr expr) => expr is FunctionExpr function && function.Name == "current"; + + public static bool IsStreamed(NodeOrder order) => order == NodeOrder.Single || order == NodeOrder.Disjoint || order == NodeOrder.Ordered; + + /// Whether the node-set has a node. + private string ExistsCode(Expr expr, Context context) + { + switch (expr) + { + case VariableExpr _: + return "(" + NodesCode(expr, context) + ".Count > 0)"; + case BinaryExpr union when union.Op == "|": + return "(" + ExistsCode(union.Left, context) + " || " + ExistsCode(union.Right, context) + ")"; + default: + return Helper("bool", context, (inner, w) => + { + EmitNodes(expr, inner, w, cursor => w.Line("return true;")); + w.Line("return false;"); + }); + } + } + + /// The first node in document order, or null. + private string FirstNodeCode(Expr expr, Context context) + { + var order = OrderOf(expr, context); + if (expr is VariableExpr || expr is BinaryExpr || order == NodeOrder.Unordered) + return "First(" + NodesCode(expr, context) + ")"; + return Helper("XObject?", context, (inner, w) => + { + if (order == NodeOrder.Reversed) + { + w.Line("XObject? first = null;"); + EmitNodes(expr, inner, w, cursor => w.Line("first = " + cursor.Var + ";")); + w.Line("return first;"); + return; + } + EmitNodes(expr, inner, w, cursor => w.Line("return " + cursor.Var + ";")); + w.Line("return null;"); + }); + } + + /// The string value of the first node in document order, or the empty string. + private string FirstStringCode(Expr expr, Context context) + { + var order = OrderOf(expr, context); + if (expr is VariableExpr || expr is BinaryExpr || order == NodeOrder.Unordered) + return "Str(" + NodesCode(expr, context) + ")"; + return Helper("string", context, (inner, w) => + { + if (order == NodeOrder.Reversed) + { + w.Line("XObject? first = null;"); + EmitNodes(expr, inner, w, cursor => w.Line("first = " + cursor.Var + ";")); + w.Line("return first == null ? \"\" : StringValue(first);"); + return; + } + EmitNodes(expr, inner, w, cursor => w.Line("return " + StringValue(cursor) + ";")); + w.Line("return \"\";"); + }); + } + + private string CountCode(Expr expr, Context context) + { + if (expr is VariableExpr || expr is BinaryExpr || OrderOf(expr, context) == NodeOrder.Unordered) + return NodesCode(expr, context) + ".Count"; + return Helper("int", context, (inner, w) => + { + w.Line("var count = 0;"); + EmitNodes(expr, inner, w, cursor => w.Line("count++;")); + w.Line("return count;"); + }); + } + + /// + /// A method for an expression, whose parameters are what the expression reads of its context (the node, the + /// position, the size, the current node) and the variables it reads; the code that calls it. + /// + private string Helper(string returnType, Context context, System.Action emit, string? extraType = null, string? extraArgument = null) + { + var scope = new CapturingScope(context.Scope); + var focus = new Focus(); + var inner = new Context("n", context.NodeKind, "p", "s", focus, "c", context.CurrentKind, focus, scope, context.Element, new Names(), context.Purity); + var body = new CodeWriter(3); + emit(inner, body); + + var parameters = new List(); + var arguments = new List(); + if (focus.NodeUsed) + { + parameters.Add(TypeName(context.NodeKind) + " n"); + arguments.Add(context.Node); + } + if (focus.PositionUsed) + { + parameters.Add("int p"); + arguments.Add(context.Position); + } + if (focus.SizeUsed) + { + parameters.Add("int s"); + arguments.Add(context.Size); + } + if (focus.CurrentUsed) + { + parameters.Add(TypeName(context.CurrentKind) + " c"); + arguments.Add(context.Current); + } + foreach (var variable in scope.Captured) + { + parameters.Add(TypeName(variable.Type) + " " + variable.Id); + arguments.Add(variable.Id); + } + if (extraType != null) + { + parameters.Add(extraType + " o"); + arguments.Add(extraArgument!); + } + return stylesheet.HelperMethod(returnType, string.Join(", ", parameters), body.ToString()) + "(" + string.Join(", ", arguments) + ")"; + } + + // node-sets: the loops + + /// The order in which reaches the nodes of the expression. + public NodeOrder OrderOf(Expr expr, Context context) + { + switch (expr) + { + case VariableExpr variable: + { + var found = Find(variable, context); + return found.Type == XType.NodeSet ? found.Order : NodeOrder.Ordered; + } + case FunctionExpr _ when IsCurrent(expr): + return NodeOrder.Single; + case FilterExpr filter: + return OrderOf(filter.Primary, context) == NodeOrder.Single || filter.Predicates.Any(p => SelectsOne(p, context)) ? NodeOrder.Single : NodeOrder.Ordered; + case PathExpr path: + { + var order = path.Start == null ? NodeOrder.Single : OrderOf(path.Start, context); + foreach (var step in Steps(path, context)) + order = After(order, step, context); + return order; + } + default: + return NodeOrder.Ordered; + } + } + + private NodeOrder After(NodeOrder order, Step step, Context context) + { + if (step.Axis == "self") + return order; + var one = step.Predicates.Any(p => SelectsOne(p, context)); + switch (order) + { + case NodeOrder.Single: + switch (step.Axis) + { + case "parent": + return NodeOrder.Single; + case "attribute" when step.Test.Kind == TestKind.Name: + return NodeOrder.Single; + case "child": + case "attribute": + case "following-sibling": + return one ? NodeOrder.Single : NodeOrder.Disjoint; + case "descendant": + case "descendant-or-self": + return one ? NodeOrder.Single : NodeOrder.Ordered; + case "preceding-sibling" when !IsReverse(step, context): + return NodeOrder.Disjoint; + default: + return one ? NodeOrder.Single : NodeOrder.Reversed; + } + case NodeOrder.Disjoint: + switch (step.Axis) + { + case "child": + case "attribute": + return NodeOrder.Disjoint; + case "descendant": + case "descendant-or-self": + return NodeOrder.Ordered; + default: + return NodeOrder.Unordered; + } + case NodeOrder.Ordered when step.Axis == "attribute": + return NodeOrder.Ordered; + default: + return NodeOrder.Unordered; + } + } + + // a predicate that keeps at most one node of those of a context node: a position + private bool SelectsOne(Expr predicate, Context context) => IsLast(predicate) || TypeOf(predicate, context) == XType.Number; + + private static bool IsLast(Expr predicate) => predicate is FunctionExpr function && function.Name == "last" && function.Arguments.Count == 0; + + // the nodes before a node are reached from the nearest, as their positions count, only when a predicate counts them + private bool IsReverse(Step step, Context context) + { + switch (step.Axis) + { + case "ancestor": + case "ancestor-or-self": + return true; + case "preceding-sibling": + return step.Predicates.Any(p => IsPositional(p, context)); + default: + return false; + } + } - var steps = path.Steps; - for (var i = 0; i < steps.Count; i++) + /// The C# type of the variables that hold the nodes of the expression. + public NodeKind KindOf(Expr expr, Context context) + { + switch (expr) + { + case FunctionExpr _ when IsCurrent(expr): + return context.CurrentKind; + case PathExpr path: + { + NodeKind kind; + if (path.Start != null) + kind = KindOf(path.Start, context); + else + kind = path.Absolute ? NodeKind.Object : context.NodeKind; + foreach (var step in Steps(path, context)) + kind = KindAfter(step, kind, context); + return kind; + } + default: + return NodeKind.Object; + } + } + + private NodeKind KindAfter(Step step, NodeKind kind, Context context) => + Test(step.Test, step.Axis == "attribute", new Cursor("node", AxisKind(step.Axis, kind)), false, context).Cursor.Kind; + + private static NodeKind AxisKind(string axis, NodeKind kind) + { + switch (axis) + { + case "child": + case "following-sibling": + case "preceding-sibling": + return NodeKind.Node; + case "attribute": + return NodeKind.Attribute; + case "self": + return kind; + default: + return NodeKind.Object; + } + } + + /// + /// The steps of a path as they are compiled: without the steps that do nothing, and with //name as + /// descendant::name when its predicates do not count positions among the children. + /// + private List Steps(PathExpr path, Context context) + { + var steps = new List(); + for (var i = 0; i < path.Steps.Count; i++) { - var step = steps[i]; + var step = path.Steps[i]; if (step.Axis == "self" && step.Test.Kind == TestKind.Node && step.Predicates.Count == 0) continue; - - // //name: descendant::name, when the predicates do not count positions among the children - if (step.IsDescendantOrSelfNode && i + 1 < steps.Count && steps[i + 1].Axis == "child" - && steps[i + 1].Predicates.All(p => !IsPositional(p, context))) + if (step.IsDescendantOrSelfNode && i + 1 < path.Steps.Count && path.Steps[i + 1].Axis == "child" + && path.Steps[i + 1].Predicates.All(p => !IsPositional(p, context))) { - var next = steps[i + 1]; - code = StepCode(code, "Descendant", next.Test, next.Predicates, false, context); + var next = path.Steps[i + 1]; + steps.Add(new Step("descendant", next.Test, next.Predicates)); i++; continue; } - code = StepCode(code, AxisName(step.Axis), step.Test, step.Predicates, step.Axis == "attribute", context); + steps.Add(step); + } + return steps; + } + + /// + /// Writes the loops over the nodes of the expression, and what writes where a node is + /// reached. The nodes are reached in the order tells, held as tells. + /// + public void EmitNodes(Expr expr, Context context, CodeWriter w, System.Action inner) + { + var names = context.Names; + switch (expr) + { + case PathExpr path: + { + var steps = Steps(path, context); + void Chain(int i, Cursor cursor) + { + if (i == steps.Count) + inner(cursor); + else + EmitStep(cursor, steps[i], context, w, next => Chain(i + 1, next)); + } + + if (path.Start != null) + { + EmitNodes(path.Start, context, w, cursor => Chain(0, cursor)); + } + else if (path.Absolute) + { + var root = names.New("x_"); + w.Line("var " + root + " = RootNode(" + context.Node + ");"); + Chain(0, new Cursor(root, NodeKind.Object)); + } + else + { + Chain(0, new Cursor(context.Node, context.NodeKind)); + } + break; + } + case FilterExpr filter: + EmitFiltered(NodeKind.Object, true, source => EmitList(NodesCode(filter.Primary, context), context, w, source), filter.Predicates, context, w, inner); + break; + case FunctionExpr _ when IsCurrent(expr): + inner(new Cursor(context.Current, context.CurrentKind)); + break; + default: + EmitList(NodesCode(expr, context), context, w, inner); + break; + } + } + + private static void EmitList(string list, Context context, CodeWriter w, System.Action inner) + { + var l = context.Names.New("l_"); + var i = context.Names.New("i_"); + var x = context.Names.New("x_"); + w.Line("var " + l + " = " + list + ";"); + w.Open("for (var " + i + " = 0; " + i + " < " + l + ".Count; " + i + "++)"); + w.Line("var " + x + " = " + l + "[" + i + "];"); + inner(new Cursor(x, NodeKind.Object)); + w.Close(); + } + + public void EmitStep(Cursor cursor, Step step, Context context, CodeWriter w, System.Action inner) + { + var reverse = IsReverse(step, context); + EmitFiltered(KindAfter(step, cursor.Kind, context), IsLoop(step), source => EmitAxis(cursor, step, reverse, context, w, source), step.Predicates, context, w, inner); + } + + private static bool IsDeclaration(NodeTestSyntax test) => test.Prefix == "xmlns" || (test.Prefix == null && test.Local == "xmlns"); + + // whether the nodes of the step are reached in a loop, which a break ends + private static bool IsLoop(Step step) + { + switch (step.Axis) + { + case "self": + case "parent": + return false; + case "attribute": + return step.Test.Kind != TestKind.Name || IsDeclaration(step.Test); + default: + return true; + } + } + + private sealed class Predicate + { + public Predicate(string position, string size) + { + Position = position; + Size = size; } - return new Compiled(code, XType.NodeSet); + + public string Position { get; } + + public string Size { get; } + + public string Code { get; set; } = ""; + + public bool Positional { get; set; } + + public bool IsLast { get; set; } + + public bool NeedsSize { get; set; } + + public bool CanBreak { get; set; } } - private string StepCode(string input, string axis, NodeTestSyntax test, List predicates, bool attributeAxis, Context context) + /// + /// The nodes of a source that pass the predicates. A predicate that counts positions counts them among the + /// nodes that passed the ones before it; one that reads the size has them counted first. + /// + public void EmitFiltered(NodeKind kind, bool isLoop, System.Action> source, List predicates, Context context, CodeWriter w, System.Action inner) { - var testField = stylesheet.NodeTest(test, context.Element); if (predicates.Count == 0) - return "Step(" + input + ", Axis." + axis + ", " + testField + ")"; - return "Step(" + input + ", Axis." + axis + ", " + testField + ", " + string.Join(", ", predicates.Select(p => Predicate(p, context))) + ")"; + { + source(inner); + return; + } + + var names = context.Names; + var node = names.New("m_"); + var compiled = new List(); + foreach (var expr in predicates) + { + var predicate = new Predicate(names.New("pos_"), names.New("size_")) { Positional = IsPositional(expr, context), IsLast = IsLast(expr) }; + if (!predicate.IsLast) + { + var focus = new Focus(); + var value = Compile(expr, context.WithFocus(node, kind, predicate.Position, predicate.Size, focus)); + switch (value.Type) + { + case XType.Number: + predicate.Code = predicate.Position + " == " + value.Code; + predicate.CanBreak = !focus.NodeUsed && !focus.PositionUsed; + break; + case XType.Any: + case XType.None: + predicate.Code = "Predicate(" + value.Code + ", " + predicate.Position + ")"; + break; + default: + predicate.Code = Bool(value); + break; + } + predicate.NeedsSize = focus.SizeUsed; + } + compiled.Add(predicate); + } + + // whether the nodes that pass the first predicates are reached in the loop of the source + bool InLoop(int count) => isLoop && !compiled.Take(count).Any(p => p.Positional && p.IsLast); + + void Passing(int count, System.Action body) + { + if (count == 0) + { + source(cursor => + { + w.Line("var " + node + " = " + cursor.Var + ";"); + body(); + }); + return; + } + + var predicate = compiled[count - 1]; + if (!predicate.Positional) + { + Passing(count - 1, () => + { + w.Open("if (" + predicate.Code + ")"); + body(); + w.Close(); + }); + return; + } + + if (predicate.IsLast) + { + var last = names.New("last_"); + w.Line(TypeName(kind) + "? " + last + " = null;"); + Passing(count - 1, () => w.Line(last + " = " + node + ";")); + w.Open("if (" + last + " != null)"); + w.Line("var " + node + " = " + last + ";"); + body(); + w.Close(); + return; + } + + // the two passes declare the same variables, each in a block of its own + if (predicate.NeedsSize) + { + w.Line("var " + predicate.Size + " = 0;"); + w.Open(); + Passing(count - 1, () => w.Line(predicate.Size + "++;")); + w.Close(); + w.Open(); + } + w.Line("var " + predicate.Position + " = 0;"); + Passing(count - 1, () => + { + w.Line(predicate.Position + "++;"); + w.Open("if (" + predicate.Code + ")"); + body(); + if (predicate.CanBreak && InLoop(count - 1)) + w.Line("break;"); + w.Close(); + }); + if (predicate.NeedsSize) + w.Close(); + } + + Passing(compiled.Count, () => inner(new Cursor(node, kind))); } - public static string AxisName(string axis) + /// The nodes of an axis from a node that pass the node test of the step. + private void EmitAxis(Cursor cursor, Step step, bool reverse, Context context, CodeWriter w, System.Action inner) { - switch (axis) + var names = context.Names; + var c = cursor.Var; + var leaf = cursor.Kind == NodeKind.Attribute || cursor.Kind == NodeKind.Text; + + void Pass(Cursor candidate, bool attributeAxis, bool amongChildren, string? condition = null) + { + var tested = Test(step.Test, attributeAxis, candidate, amongChildren, context); + if (tested.Never) + return; + var all = condition == null ? tested.Condition : tested.Condition == null ? condition : condition + " && " + tested.Condition; + if (all == null) + { + inner(tested.Cursor); + return; + } + w.Open("if (" + all + ")"); + inner(tested.Cursor); + w.Close(); + } + + void Loop(string type, string first, string next, bool amongChildren, NodeKind kind, string? until = null) + { + var x = names.New("x_"); + w.Open("for (" + type + " " + x + " = " + first + "; " + x + " != null" + (until == null ? "" : " && !ReferenceEquals(" + x + ", " + until + ")") + "; " + x + " = " + string.Format(CultureInfo.InvariantCulture, next, x) + ")"); + Pass(new Cursor(x, kind), false, amongChildren); + w.Close(); + } + + var typed = cursor.Kind == NodeKind.Element || cursor.Kind == NodeKind.Node || cursor.Kind == NodeKind.Text; + switch (step.Axis) { case "child": - return "Child"; + if (!leaf) + Loop("var", cursor.Kind == NodeKind.Element ? c + ".FirstNode" : "FirstChild(" + c + ")", "{0}.NextNode", true, NodeKind.Node); + break; case "descendant": - return "Descendant"; + if (!leaf) + Loop("XObject?", "FirstChild(" + c + ")", "NextInTree({0}, " + c + ")", true, NodeKind.Object); + break; case "descendant-or-self": - return "DescendantOrSelf"; - case "parent": - return "Parent"; - case "ancestor": - return "Ancestor"; - case "ancestor-or-self": - return "AncestorOrSelf"; + Loop("XObject?", c, "NextInTree({0}, " + c + ")", true, NodeKind.Object); + break; case "following-sibling": - return "FollowingSibling"; + if (cursor.Kind != NodeKind.Attribute) + Loop("var", typed ? c + ".NextNode" : "NextSibling(" + c + ")", "{0}.NextNode", true, NodeKind.Node); + break; + case "preceding-sibling" when cursor.Kind == NodeKind.Attribute: + break; + case "preceding-sibling" when reverse: + Loop("var", typed ? c + ".PreviousNode" : "PreviousSibling(" + c + ")", "{0}.PreviousNode", true, NodeKind.Node); + break; case "preceding-sibling": - return "PrecedingSibling"; + Loop("var", "FirstSibling(" + c + ")", "{0}.NextNode", true, NodeKind.Node, c); + break; + case "ancestor": + Loop("var", "Parent(" + c + ")", "Parent({0})", false, NodeKind.Object); + break; + case "ancestor-or-self": + Loop("XObject?", c, "Parent({0})", false, NodeKind.Object); + break; + case "parent": + { + var parent = names.New("x_"); + w.Line("var " + parent + " = Parent(" + c + ");"); + Pass(new Cursor(parent, NodeKind.Object), false, false, parent + " != null"); + break; + } case "self": - return "Self"; + Pass(cursor, false, false); + break; case "attribute": - return "Attribute"; + { + if (leaf) + break; + var element = c; + if (cursor.Kind != NodeKind.Element) + { + element = names.New("e_"); + w.Open("if (" + c + " is XElement " + element + ")"); + } + var attribute = names.New("a_"); + if (IsLoop(step)) + { + w.Open("for (var " + attribute + " = " + element + ".FirstAttribute; " + attribute + " != null; " + attribute + " = " + attribute + ".NextAttribute)"); + Pass(new Cursor(attribute, NodeKind.Attribute), true, false, "!" + attribute + ".IsNamespaceDeclaration"); + w.Close(); + } + else + { + w.Line("var " + attribute + " = " + element + ".Attribute(" + stylesheet.Name(XName.Get(step.Test.Local!, StylesheetCompiler.Namespace(step.Test.Prefix, context.Element))) + ");"); + w.Open("if (" + attribute + " != null)"); + inner(new Cursor(attribute, NodeKind.Attribute)); + w.Close(); + } + if (cursor.Kind != NodeKind.Element) + w.Close(); + break; + } default: - throw new XsltException("The axis " + axis + " is not supported."); + throw new XsltException("The axis " + step.Axis + " is not supported."); } } - /// A lambda of XPathPredicate: the predicate evaluated with the node, its position and the size. - public string Predicate(Expr predicate, Context context) + internal readonly struct Tested { - var n = stylesheet.NewName("n"); - var p = stylesheet.NewName("p"); - var s = stylesheet.NewName("s"); - var value = Compile(predicate, context.WithFocus(n, p, s)); - string body; - switch (value.Type) + public Tested(string? condition, Cursor cursor, bool never = false) { - case XType.Number: - body = p + " == " + value.Code; - break; - case XType.Any: - body = "Predicate(" + value.Code + ", " + p + ")"; - break; + Condition = condition; + Cursor = cursor; + Never = never; + } + + /// The C# condition of the test, or null when every node passes. + public string? Condition { get; } + + /// The node, as the type the test tells it has. + public Cursor Cursor { get; } + + /// Whether no node passes. + public bool Never { get; } + } + + /// + /// A node test on a node: on the attribute axis, whose nodes are attributes, or on another axis, where a name + /// is the name of an element. Among the children of a node, those of a document that are no nodes of XPath + /// (the document type, the white space) do not pass. + /// + public Tested Test(NodeTestSyntax test, bool attributeAxis, Cursor cursor, bool amongChildren, Context context) + { + var c = cursor.Var; + if (attributeAxis) + { + switch (test.Kind) + { + case TestKind.Name: + return new Tested(c + ".Name == " + stylesheet.Name(XName.Get(test.Local!, StylesheetCompiler.Namespace(test.Prefix, context.Element))), cursor); + case TestKind.Namespace: + return new Tested(c + ".Name.Namespace == " + NamespaceField(test, context), cursor); + case TestKind.AnyName: + case TestKind.Node: + return new Tested(null, cursor); + default: + return new Tested(null, cursor, true); + } + } + + var leaf = cursor.Kind == NodeKind.Attribute || cursor.Kind == NodeKind.Text; + switch (test.Kind) + { + case TestKind.Name: + case TestKind.Namespace: + case TestKind.AnyName: + { + if (leaf) + return new Tested(null, new Cursor(c, NodeKind.Element), true); + var element = c; + string? condition = null; + if (cursor.Kind != NodeKind.Element) + { + element = context.Names.New("e_"); + condition = c + " is XElement " + element; + } + string? name = null; + switch (test.Kind) + { + case TestKind.Name: + name = element + ".Name == " + stylesheet.Name(XName.Get(test.Local!, StylesheetCompiler.Namespace(test.Prefix, context.Element))); + break; + case TestKind.Namespace: + name = element + ".Name.Namespace == " + NamespaceField(test, context); + break; + } + if (name != null) + condition = condition == null ? name : condition + " && " + name; + return new Tested(condition, new Cursor(element, NodeKind.Element)); + } + case TestKind.Node: + return new Tested(amongChildren ? "IsNode(" + c + ")" : null, cursor); + case TestKind.Text: + { + switch (cursor.Kind) + { + case NodeKind.Text: + return new Tested(null, cursor); + case NodeKind.Element: + case NodeKind.Attribute: + return new Tested(null, new Cursor(c, NodeKind.Text), true); + } + var text = context.Names.New("t_"); + return new Tested(c + " is XText " + text + (amongChildren ? " && IsNode(" + text + ")" : ""), new Cursor(text, NodeKind.Text)); + } + case TestKind.Comment: + return new Tested(c + " is XComment", cursor, cursor.Kind == NodeKind.Element || leaf); default: - body = Bool(value); - break; + { + if (test.Local == null) + return new Tested(c + " is XProcessingInstruction", cursor, cursor.Kind == NodeKind.Element || leaf); + var instruction = context.Names.New("i_"); + return new Tested(c + " is XProcessingInstruction " + instruction + " && " + instruction + ".Target == " + Literal(test.Local), cursor, cursor.Kind == NodeKind.Element || leaf); + } } - return "(" + n + ", " + p + ", " + s + ") => " + body; } + private string NamespaceField(NodeTestSyntax test, Context context) => + stylesheet.StaticField("XNamespace", "XNamespace.Get(" + Literal(StylesheetCompiler.Namespace(test.Prefix, context.Element)) + ")"); + /// /// Whether the value of a predicate depends on the position of the node among the others: a number (or a /// value that may be one), or an expression that reads position() or last(). @@ -394,8 +1323,8 @@ public bool IsPositional(Expr predicate, Context context) { if (UsesFocus(predicate)) return true; - var type = Compile(predicate, context.WithFocus("n", "p", "s")).Type; - return type == XType.Number || type == XType.Any; + var type = TypeOf(predicate, context); + return type == XType.Number || IsUnknown(type); } // whether the expression reads the position or size of its context (not that of a nested predicate) @@ -422,13 +1351,54 @@ private static bool UsesFocus(Expr expr) // conversions - public static string Str(Compiled value) => value.Type == XType.String ? value.Code : "Str(" + value.Code + ")"; + public static string StringValue(Cursor cursor) => + cursor.Kind == NodeKind.Object || cursor.Kind == NodeKind.Node ? "StringValue(" + cursor.Var + ")" : cursor.Var + ".Value"; - public static string Num(Compiled value) => value.Type == XType.Number ? value.Code : "Num(" + value.Code + ")"; + public static string Str(Compiled value) + { + if (value.IsNodeSet) + return value.Owner.FirstStringCode(value.Expr!, value.Context!); + return value.Type == XType.String || value.Type == XType.Text ? value.Code : "Str(" + value.Code + ")"; + } - public static string Bool(Compiled value) => value.Type == XType.Boolean ? value.Code : "Bool(" + value.Code + ")"; + public static string Num(Compiled value) + { + if (value.IsNodeSet) + return "Num(" + Str(value) + ")"; + return value.Type == XType.Number ? value.Code : "Num(" + value.Code + ")"; + } - public static string Box(Compiled value) => "(object)" + value.Code; + public static string Bool(Compiled value) + { + if (value.IsNodeSet) + return value.Owner.ExistsCode(value.Expr!, value.Context!); + switch (value.Type) + { + case XType.Boolean: + return value.Code; + // a result tree fragment is a node-set of its root node + case XType.Text: + case XType.Fragment: + return "true"; + default: + return "Bool(" + value.Code + ")"; + } + } + + /// The value as an object: one of unknown type, as the value of a parameter of unknown type. + public static string Box(Compiled value) + { + switch (value.Type) + { + case XType.Text: + return "new ResultFragment(" + value.Code + ")"; + case XType.Any: + case XType.None: + return value.Code; + default: + return "(object)" + value.Code; + } + } public static string Nodes(Compiled value) { @@ -437,7 +1407,9 @@ public static string Nodes(Compiled value) case XType.NodeSet: return value.Code; case XType.Any: + case XType.None: return "Nodes(" + value.Code + ")"; + case XType.Text: case XType.Fragment: throw new XsltException("A result tree fragment cannot be used as a node-set in XSLT 1.0."); default: @@ -450,6 +1422,7 @@ public static string TypeName(XType type) switch (type) { case XType.String: + case XType.Text: return "string"; case XType.Number: return "double"; @@ -464,6 +1437,23 @@ public static string TypeName(XType type) } } + public static string TypeName(NodeKind kind) + { + switch (kind) + { + case NodeKind.Node: + return "XNode"; + case NodeKind.Element: + return "XElement"; + case NodeKind.Attribute: + return "XAttribute"; + case NodeKind.Text: + return "XText"; + default: + return "XObject"; + } + } + public static string Literal(string value) { var result = new StringBuilder("\""); diff --git a/src/SharpEquations.XsltGenerator/XsltGenerator.cs b/src/SharpEquations.XsltGenerator/XsltGenerator.cs index 1363b85..c0353c0 100644 --- a/src/SharpEquations.XsltGenerator/XsltGenerator.cs +++ b/src/SharpEquations.XsltGenerator/XsltGenerator.cs @@ -51,7 +51,16 @@ private static void Generate(SourceProductionContext output, string path, string using (var reader = XmlReader.Create(new StringReader(text), settings)) document = XDocument.Load(reader, LoadOptions.SetLineInfo | LoadOptions.PreserveWhitespace); var className = ClassName(path); - var source = new StylesheetCompiler(document.Root!, className, fileName).Compile(); + // compiled again with what each compilation learns of the templates, until nothing is new + var facts = new Facts(); + string source; + while (true) + { + var compiler = new StylesheetCompiler(document.Root!, className, fileName, facts); + source = compiler.Compile(); + if (!facts.Add(compiler.Learnt)) + break; + } output.AddSource(className + ".g.cs", SourceText.From(source, Encoding.UTF8)); } catch (XsltException e) diff --git a/src/SharpEquations/Internal/Xslt/NodeTest.cs b/src/SharpEquations/Internal/Xslt/NodeTest.cs deleted file mode 100644 index 0b96e75..0000000 --- a/src/SharpEquations/Internal/Xslt/NodeTest.cs +++ /dev/null @@ -1,75 +0,0 @@ -#nullable enable - -namespace SharpEquations.Internal.Xslt -{ - using System.Xml.Linq; - - /// The node test of an XPath step: a name, a namespace wildcard, * or a node type. - internal sealed class NodeTest - { - private enum Kind - { - Name, - Namespace, - AnyName, - Node, - Text, - Comment, - ProcessingInstruction, - } - - private readonly Kind kind; - private readonly XName? name; - private readonly string? text; - - private NodeTest(Kind kind, XName? name = null, string? text = null) - { - this.kind = kind; - this.name = name; - this.text = text; - } - - public static NodeTest Named(XName name) => new NodeTest(Kind.Name, name); - - public static NodeTest InNamespace(string namespaceName) => new NodeTest(Kind.Namespace, text: namespaceName); - - public static readonly NodeTest AnyName = new NodeTest(Kind.AnyName); - - public static readonly NodeTest Node = new NodeTest(Kind.Node); - - public static readonly NodeTest Text = new NodeTest(Kind.Text); - - public static readonly NodeTest Comment = new NodeTest(Kind.Comment); - - public static NodeTest ProcessingInstruction(string? target) => new NodeTest(Kind.ProcessingInstruction, text: target); - - /// - /// Whether the node passes the test, on an axis whose principal node type is the attribute (the attribute - /// axis) or the element (every other axis). - /// - public bool Matches(XObject node, bool attributeAxis) - { - switch (kind) - { - case Kind.Name: - return attributeAxis - ? node is XAttribute attribute && attribute.Name == name - : node is XElement element && element.Name == name; - case Kind.Namespace: - return attributeAxis - ? node is XAttribute attribute2 && attribute2.Name.NamespaceName == text - : node is XElement element2 && element2.Name.NamespaceName == text; - case Kind.AnyName: - return attributeAxis ? node is XAttribute : node is XElement; - case Kind.Node: - return true; - case Kind.Text: - return node is XText; - case Kind.Comment: - return node is XComment; - default: - return node is XProcessingInstruction instruction && (text == null || instruction.Target == text); - } - } - } -} diff --git a/src/SharpEquations/Internal/Xslt/ResultFragment.cs b/src/SharpEquations/Internal/Xslt/ResultFragment.cs index 703040d..17d5479 100644 --- a/src/SharpEquations/Internal/Xslt/ResultFragment.cs +++ b/src/SharpEquations/Internal/Xslt/ResultFragment.cs @@ -7,12 +7,21 @@ namespace SharpEquations.Internal.Xslt /// A result tree fragment: the value of a variable or parameter given by its content. internal sealed class ResultFragment { - public ResultFragment(XElement root) => Root = root; + private readonly string? text; + private XElement? root; + + public ResultFragment(XElement root) => this.root = root; + + /// A fragment that is only text. + public ResultFragment(string text) => this.text = text; + + /// The text of a fragment that is only text, or null. + public string? Text => text; /// The nodes of the fragment, as the children of an element that is not part of it. - public XElement Root { get; } + public XElement Root => root ??= new XElement(XsltOutput.Container, text!.Length > 0 ? new XText(text) : null); - public string Value => Root.Value; + public string Value => text ?? root!.Value; } /// The parameters passed by xsl:apply-templates. @@ -37,7 +46,4 @@ public TemplateArguments(string[] names, object[] values) return null; } } - - /// An XPath predicate, or any expression evaluated with a context node, position and size. - internal delegate bool XPathPredicate(XObject node, int position, int size); } diff --git a/src/SharpEquations/Internal/Xslt/XPathFunctions.cs b/src/SharpEquations/Internal/Xslt/XPathFunctions.cs index f083155..641f1bf 100644 --- a/src/SharpEquations/Internal/Xslt/XPathFunctions.cs +++ b/src/SharpEquations/Internal/Xslt/XPathFunctions.cs @@ -10,20 +10,6 @@ namespace SharpEquations.Internal.Xslt using System.Xml.Linq; using SharpEquations.Internal.Text; - internal enum Axis - { - Child, - Descendant, - DescendantOrSelf, - Parent, - Ancestor, - AncestorOrSelf, - FollowingSibling, - PrecedingSibling, - Self, - Attribute, - } - internal enum Comparison { Equal, @@ -324,14 +310,6 @@ private static Comparison Swap(Comparison comparison) public static List Single(XObject node) => new List(1) { node }; - public static List Root(XObject node) - { - var root = node; - for (var parent = Parent(root); parent != null; parent = Parent(parent)) - root = parent; - return Single(root); - } - public static XObject? Parent(XObject node) { switch (node) @@ -360,128 +338,55 @@ public static List Union(List left, List right) return result; } - public static List Step(List input, Axis axis, NodeTest test) - { - var result = new List(); - var attributeAxis = axis == Axis.Attribute; - foreach (var context in input) - { - foreach (var node in Along(context, axis)) - { - if (test.Matches(node, attributeAxis)) - result.Add(node); - } - } - Order(result, input.Count, axis); - return result; - } + public static XObject? First(List nodes) => nodes.Count == 0 ? null : nodes[0]; - public static List Step(List input, Axis axis, NodeTest test, params XPathPredicate[] predicates) + public static XObject RootNode(XObject node) { - var result = new List(); - var attributeAxis = axis == Axis.Attribute; - var candidates = new List(); - foreach (var context in input) - { - candidates.Clear(); - foreach (var node in Along(context, axis)) - { - if (test.Matches(node, attributeAxis)) - candidates.Add(node); - } - result.AddRange(Apply(candidates, predicates)); - } - Order(result, input.Count, axis); - return result; + var root = node; + for (var parent = Parent(root); parent != null; parent = Parent(parent)) + root = parent; + return root; } - public static List Filter(List nodes, XPathPredicate predicate) - { - var result = new List(); - for (var i = 0; i < nodes.Count; i++) - { - if (predicate(nodes[i], i + 1, nodes.Count)) - result.Add(nodes[i]); - } - return result; - } + public static XNode? FirstChild(XObject node) => node is XContainer container ? container.FirstNode : null; - private static List Apply(List candidates, XPathPredicate[] predicates) - { - var nodes = candidates; - foreach (var predicate in predicates) - nodes = Filter(nodes, predicate); - return ReferenceEquals(nodes, candidates) ? new List(candidates) : nodes; - } + public static XNode? NextSibling(XObject node) => node is XNode sibling ? sibling.NextNode : null; - private static bool IsReverse(Axis axis) => - axis == Axis.Ancestor || axis == Axis.AncestorOrSelf || axis == Axis.PrecedingSibling; + public static XNode? PreviousSibling(XObject node) => node is XNode sibling ? sibling.PreviousNode : null; - private static void Order(List nodes, int contexts, Axis axis) - { - if (contexts > 1) - SortUnique(nodes); - else if (IsReverse(axis)) - nodes.Reverse(); - } + /// The first of the nodes that have the parent of the node, if it is one of them (an attribute is not). + public static XNode? FirstSibling(XObject node) => + node is XNode && !(node is XDocument) && Parent(node) is XContainer parent ? parent.FirstNode : null; - private static IEnumerable Along(XObject node, Axis axis) + /// The node after a node of a tree in document order, within the tree. + public static XObject? NextInTree(XObject node, XObject root) { - switch (axis) + if (node is XContainer container && container.FirstNode is XNode first) + return first; + for (var current = node; !ReferenceEquals(current, root); ) { - case Axis.Child: - return Children(node); - case Axis.Descendant: - return Descendants(node); - case Axis.DescendantOrSelf: - return new[] { node }.Concat(Descendants(node)); - case Axis.Parent: - var parent = Parent(node); - return parent == null ? Enumerable.Empty() : new[] { parent }; - case Axis.Ancestor: - return Ancestors(node); - case Axis.AncestorOrSelf: - return new[] { node }.Concat(Ancestors(node)); - case Axis.FollowingSibling: - return node is XNode following && !(node is XDocument) ? following.NodesAfterSelf().Where(IsInModel) : Enumerable.Empty(); - case Axis.PrecedingSibling: - return node is XNode preceding && !(node is XDocument) ? preceding.NodesBeforeSelf().Reverse().Where(IsInModel) : Enumerable.Empty(); - case Axis.Self: - return new[] { node }; - default: - return node is XElement element ? element.Attributes().Where(a => !a.IsNamespaceDeclaration) : Enumerable.Empty(); + if (current is XNode sibling && sibling.NextNode is XNode next) + return next; + var parent = Parent(current); + if (parent == null) + return null; + current = parent; } + return null; } public static List ChildNodes(XObject node) => new List(Children(node)); - /// - /// Whether a node matches a step of a pattern whose predicates count positions: whether the step, from the - /// parent of the node, selects it. - /// - public static bool MatchesStep(XObject node, Axis axis, NodeTest test, params XPathPredicate[] predicates) - { - var parent = Parent(node); - return parent != null && test.Matches(node, axis == Axis.Attribute) && Step(Single(parent), axis, test, predicates).Contains(node); - } - public static IEnumerable Children(XObject node) => node is XContainer container ? container.Nodes().Where(IsInModel) : Enumerable.Empty(); - private static IEnumerable Descendants(XObject node) => - node is XContainer container ? container.DescendantNodes().Where(IsInModel) : Enumerable.Empty(); - - private static IEnumerable Ancestors(XObject node) - { - for (var parent = Parent(node); parent != null; parent = Parent(parent)) - yield return parent; - } - // the document type and the white space around the document element are not nodes of XPath private static bool IsInModel(XNode node) => !(node is XDocumentType) && !(node is XText && node.Parent == null); - private static void SortUnique(List nodes) + public static bool IsNode(XObject node) => !(node is XNode other) || IsInModel(other); + + public static void SortUnique(List nodes) { nodes.Sort(DocumentOrder); var write = 0; diff --git a/src/SharpEquations/Internal/Xslt/XsltOutput.cs b/src/SharpEquations/Internal/Xslt/XsltOutput.cs index 0d820e9..28542a7 100644 --- a/src/SharpEquations/Internal/Xslt/XsltOutput.cs +++ b/src/SharpEquations/Internal/Xslt/XsltOutput.cs @@ -19,7 +19,7 @@ namespace SharpEquations.Internal.Xslt /// internal sealed class XsltOutput { - private static readonly XName Container = XName.Get("fragment"); + public static readonly XName Container = XName.Get("fragment"); private readonly Stack open = new Stack(); private readonly Stack roots = new Stack(); @@ -31,6 +31,11 @@ internal sealed class XsltOutput private bool hasText; private bool hasMarkup; + // the text captured as strings, one capture after the other, and where the one in progress starts (-1: none) + private readonly StringBuilder captured = new StringBuilder(); + private readonly Stack captures = new Stack(); + private int capture = -1; + public XsltOutput() { open.Push(result); @@ -65,6 +70,11 @@ public void Attribute(XName name, string value) public void Text(string value) { + if (capture >= 0) + { + captured.Append(value); + return; + } hasText = true; text.Append(value); foreach (var c in value) @@ -137,12 +147,24 @@ public void CopyOf(List nodes) public void CopyOf(ResultFragment fragment) { + if (fragment.Text != null) + { + CopyOfText(fragment.Text); + return; + } foreach (var node in fragment.Root.Nodes()) Copy(node); } public void CopyOf(string value) => Text(value); + /// The copy of a result tree fragment that is only text: its text node, if it has one. + public void CopyOfText(string value) + { + if (value.Length > 0) + Text(value); + } + public void CopyOf(object value) { switch (value) @@ -159,7 +181,7 @@ public void CopyOf(object value) } } - private void Copy(XObject node) + public void Copy(XObject node) { switch (node) { @@ -202,8 +224,25 @@ public bool StartCopy(XObject node) } } + /// Starts keeping the text written as a string: only text is written until . + public void BeginText() + { + captures.Push(capture); + capture = captured.Length; + } + + public string EndText() + { + var value = captured.ToString(capture, captured.Length - capture); + captured.Length = capture; + capture = captures.Pop(); + return value; + } + public void BeginCapture() { + captures.Push(capture); + capture = -1; Flush(); var root = new XElement(Container); open.Push(root); @@ -214,6 +253,7 @@ public ResultFragment EndFragment() { Flush(); open.Pop(); + capture = captures.Pop(); return new ResultFragment(roots.Pop()); } @@ -223,6 +263,7 @@ public string EndString() hasMarkup = false; Flush(); open.Pop(); + capture = captures.Pop(); return roots.Pop().Value; } From fed168137992f9a8826221e90ffbf0bd6c5a785f Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 10 Nov 2026 23:39:44 +0000 Subject: [PATCH 04/11] XSLT run time: the result tree without stacks and builders until they are needed The open element is found by its parent, the text between two nodes is kept as the string it mostly is, its markup is built only once some is written with disable-output-escaping, and a short whole number is read without a copy. Co-Authored-By: Claude Fable 5.2 Claude-Session: https://claude.ai/code/session_01Q8QQiasbLr6WtXXCEP1zrJ --- ...s.StylesheetBenchmarks-20261110-233329.log | 453 ++++++++++++++++++ ...arks.StylesheetBenchmarks-report-github.md | 18 +- ...Benchmarks.StylesheetBenchmarks-report.csv | 12 +- ...enchmarks.StylesheetBenchmarks-report.html | 16 +- .../Internal/Xslt/XPathFunctions.cs | 28 +- .../Internal/Xslt/XsltOutput.cs | 146 ++++-- 6 files changed, 596 insertions(+), 77 deletions(-) create mode 100644 benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-233329.log diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-233329.log b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-233329.log new file mode 100644 index 0000000..4969b03 --- /dev/null +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-233329.log @@ -0,0 +1,453 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 6 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 3.58 sec and exited with 0 +// start dotnet build -c Release --no-restore --nodeReuse:false /p:UseSharedCompilation=false /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/" /p:OutDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:OutputPath="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" /p:PublishDir="/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/publish/" --output "/home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0/" in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1 +// command took 43.79 sec and exited with 0 +// ***** Done, took 00:00:47 (47.44 sec) ***** +// Found 6 benchmarks: +// StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathML --job ShortRun --benchmarkId 0 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 407594.00 ns, 407.5940 us/op +WorkloadJitting 1: 1 op, 64739679.00 ns, 64.7397 ms/op + +WorkloadPilot 1: 2 op, 143179338.00 ns, 71.5897 ms/op +WorkloadPilot 2: 3 op, 254866046.00 ns, 84.9553 ms/op +WorkloadPilot 3: 4 op, 280798856.00 ns, 70.1997 ms/op +WorkloadPilot 4: 5 op, 114633825.00 ns, 22.9268 ms/op +WorkloadPilot 5: 6 op, 128007964.00 ns, 21.3347 ms/op +WorkloadPilot 6: 7 op, 134543828.00 ns, 19.2205 ms/op +WorkloadPilot 7: 8 op, 173105519.00 ns, 21.6382 ms/op +WorkloadPilot 8: 9 op, 210252318.00 ns, 23.3614 ms/op +WorkloadPilot 9: 10 op, 202828229.00 ns, 20.2828 ms/op +WorkloadPilot 10: 11 op, 254372272.00 ns, 23.1248 ms/op +WorkloadPilot 11: 12 op, 271519067.00 ns, 22.6266 ms/op +WorkloadPilot 12: 13 op, 263514628.00 ns, 20.2704 ms/op +WorkloadPilot 13: 14 op, 290968647.00 ns, 20.7835 ms/op +WorkloadPilot 14: 15 op, 294165036.00 ns, 19.6110 ms/op +WorkloadPilot 15: 16 op, 319270702.00 ns, 19.9544 ms/op +WorkloadPilot 16: 32 op, 651186601.00 ns, 20.3496 ms/op + +WorkloadWarmup 1: 32 op, 664504798.00 ns, 20.7658 ms/op +WorkloadWarmup 2: 32 op, 648829739.00 ns, 20.2759 ms/op +WorkloadWarmup 3: 32 op, 631480511.00 ns, 19.7338 ms/op + +// BeforeActualRun +WorkloadActual 1: 32 op, 627949282.00 ns, 19.6234 ms/op +WorkloadActual 2: 32 op, 677408715.00 ns, 21.1690 ms/op +WorkloadActual 3: 32 op, 692909075.00 ns, 21.6534 ms/op + +// AfterActualRun +WorkloadResult 1: 32 op, 627949282.00 ns, 19.6234 ms/op +WorkloadResult 2: 32 op, 677408715.00 ns, 21.1690 ms/op +WorkloadResult 3: 32 op, 692909075.00 ns, 21.6534 ms/op +// GC: 8 0 0 1197209856 32 +// Threading: 0 0 32 + +// AfterAll +// Benchmark Process 888 has exited with code 0. + +Mean = 20.815 ms, StdErr = 0.612 ms (2.94%), N = 3, StdDev = 1.060 ms +Min = 19.623 ms, Q1 = 20.396 ms, Median = 21.169 ms, Q3 = 21.411 ms, Max = 21.653 ms +IQR = 1.015 ms, LowerFence = 18.874 ms, UpperFence = 22.934 ms +ConfidenceInterval = [1.473 ms; 40.158 ms] (CI 99.9%), Margin = 19.342 ms (92.92% of Mean) +Skewness = -0.3, Kurtosis = 0.67, MValue = 2 + +// ** Remained 5 (83.3 %) benchmark(s) to run. Estimated finish 2026-11-10 23:35 (0h 1m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Omml2MathMLXslCompiledTransform --job ShortRun --benchmarkId 1 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 255595.00 ns, 255.5950 us/op +WorkloadJitting 1: 1 op, 231916270.00 ns, 231.9163 ms/op + +WorkloadPilot 1: 2 op, 498855812.00 ns, 249.4279 ms/op +WorkloadPilot 2: 3 op, 574628344.00 ns, 191.5428 ms/op + +WorkloadWarmup 1: 3 op, 500824136.00 ns, 166.9414 ms/op +WorkloadWarmup 2: 3 op, 464158938.00 ns, 154.7196 ms/op +WorkloadWarmup 3: 3 op, 287658074.00 ns, 95.8860 ms/op + +// BeforeActualRun +WorkloadActual 1: 3 op, 242274478.00 ns, 80.7582 ms/op +WorkloadActual 2: 3 op, 196730056.00 ns, 65.5767 ms/op +WorkloadActual 3: 3 op, 196609516.00 ns, 65.5365 ms/op + +// AfterActualRun +WorkloadResult 1: 3 op, 242274478.00 ns, 80.7582 ms/op +WorkloadResult 2: 3 op, 196730056.00 ns, 65.5767 ms/op +WorkloadResult 3: 3 op, 196609516.00 ns, 65.5365 ms/op +// GC: 3 0 0 491891160 3 +// Threading: 0 0 3 + +// AfterAll +// Benchmark Process 901 has exited with code 0. + +Mean = 70.624 ms, StdErr = 5.067 ms (7.17%), N = 3, StdDev = 8.777 ms +Min = 65.537 ms, Q1 = 65.557 ms, Median = 65.577 ms, Q3 = 73.167 ms, Max = 80.758 ms +IQR = 7.611 ms, LowerFence = 54.140 ms, UpperFence = 84.584 ms +ConfidenceInterval = [-89.495 ms; 230.743 ms] (CI 99.9%), Margin = 160.119 ms (226.72% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 + +// ** Remained 4 (66.7 %) benchmark(s) to run. Estimated finish 2026-11-10 23:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2Omml --job ShortRun --benchmarkId 2 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 276872.00 ns, 276.8720 us/op +WorkloadJitting 1: 1 op, 163917798.00 ns, 163.9178 ms/op + +WorkloadPilot 1: 2 op, 323673403.00 ns, 161.8367 ms/op +WorkloadPilot 2: 3 op, 425983152.00 ns, 141.9944 ms/op +WorkloadPilot 3: 4 op, 614147025.00 ns, 153.5368 ms/op + +WorkloadWarmup 1: 4 op, 281058253.00 ns, 70.2646 ms/op +WorkloadWarmup 2: 4 op, 145687095.00 ns, 36.4218 ms/op +WorkloadWarmup 3: 4 op, 112973595.00 ns, 28.2434 ms/op + +// BeforeActualRun +WorkloadActual 1: 4 op, 136822772.00 ns, 34.2057 ms/op +WorkloadActual 2: 4 op, 116266469.00 ns, 29.0666 ms/op +WorkloadActual 3: 4 op, 119285240.00 ns, 29.8213 ms/op + +// AfterActualRun +WorkloadResult 1: 4 op, 136822772.00 ns, 34.2057 ms/op +WorkloadResult 2: 4 op, 116266469.00 ns, 29.0666 ms/op +WorkloadResult 3: 4 op, 119285240.00 ns, 29.8213 ms/op +// GC: 0 0 0 126777568 4 +// Threading: 0 0 4 + +// AfterAll +// Benchmark Process 914 has exited with code 0. + +Mean = 31.031 ms, StdErr = 1.602 ms (5.16%), N = 3, StdDev = 2.775 ms +Min = 29.067 ms, Q1 = 29.444 ms, Median = 29.821 ms, Q3 = 32.014 ms, Max = 34.206 ms +IQR = 2.570 ms, LowerFence = 25.590 ms, UpperFence = 35.868 ms +ConfidenceInterval = [-19.594 ms; 81.657 ms] (CI 99.9%), Margin = 50.626 ms (163.14% of Mean) +Skewness = 0.35, Kurtosis = 0.67, MValue = 2 + +// ** Remained 3 (50.0 %) benchmark(s) to run. Estimated finish 2026-11-10 23:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.MathML2OmmlXslCompiledTransform --job ShortRun --benchmarkId 3 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 326224.00 ns, 326.2240 us/op +WorkloadJitting 1: 1 op, 445740451.00 ns, 445.7405 ms/op + +OverheadJitting 2: 1 op, 850.00 ns, 850.0000 ns/op +WorkloadJitting 2: 1 op, 197211980.00 ns, 197.2120 ms/op + +WorkloadPilot 1: 2 op, 499088537.00 ns, 249.5443 ms/op +WorkloadPilot 2: 3 op, 611411021.00 ns, 203.8037 ms/op + +WorkloadWarmup 1: 3 op, 587943369.00 ns, 195.9811 ms/op +WorkloadWarmup 2: 3 op, 401679184.00 ns, 133.8931 ms/op +WorkloadWarmup 3: 3 op, 285533910.00 ns, 95.1780 ms/op + +// BeforeActualRun +WorkloadActual 1: 3 op, 219200267.00 ns, 73.0668 ms/op +WorkloadActual 2: 3 op, 227028138.00 ns, 75.6760 ms/op +WorkloadActual 3: 3 op, 225791888.00 ns, 75.2640 ms/op + +// AfterActualRun +WorkloadResult 1: 3 op, 219200267.00 ns, 73.0668 ms/op +WorkloadResult 2: 3 op, 227028138.00 ns, 75.6760 ms/op +WorkloadResult 3: 3 op, 225791888.00 ns, 75.2640 ms/op +// GC: 3 0 0 428802192 3 +// Threading: 0 0 3 + +// AfterAll +// Benchmark Process 925 has exited with code 0. + +Mean = 74.669 ms, StdErr = 0.810 ms (1.08%), N = 3, StdDev = 1.403 ms +Min = 73.067 ms, Q1 = 74.165 ms, Median = 75.264 ms, Q3 = 75.470 ms, Max = 75.676 ms +IQR = 1.305 ms, LowerFence = 72.208 ms, UpperFence = 77.427 ms +ConfidenceInterval = [49.078 ms; 100.260 ms] (CI 99.9%), Margin = 25.591 ms (34.27% of Mean) +Skewness = -0.35, Kurtosis = 0.67, MValue = 2 + +// ** Remained 2 (33.3 %) benchmark(s) to run. Estimated finish 2026-11-10 23:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathML --job ShortRun --benchmarkId 4 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 229072.00 ns, 229.0720 us/op +WorkloadJitting 1: 1 op, 95335268.00 ns, 95.3353 ms/op + +WorkloadPilot 1: 2 op, 175768531.00 ns, 87.8843 ms/op +WorkloadPilot 2: 3 op, 279690532.00 ns, 93.2302 ms/op +WorkloadPilot 3: 4 op, 385695083.00 ns, 96.4238 ms/op +WorkloadPilot 4: 5 op, 394074556.00 ns, 78.8149 ms/op +WorkloadPilot 5: 6 op, 471372327.00 ns, 78.5621 ms/op +WorkloadPilot 6: 7 op, 262721295.00 ns, 37.5316 ms/op +WorkloadPilot 7: 8 op, 166871437.00 ns, 20.8589 ms/op +WorkloadPilot 8: 9 op, 180242528.00 ns, 20.0269 ms/op +WorkloadPilot 9: 10 op, 278465168.00 ns, 27.8465 ms/op +WorkloadPilot 10: 11 op, 217539192.00 ns, 19.7763 ms/op +WorkloadPilot 11: 12 op, 224311151.00 ns, 18.6926 ms/op +WorkloadPilot 12: 13 op, 328378661.00 ns, 25.2599 ms/op +WorkloadPilot 13: 14 op, 274596764.00 ns, 19.6141 ms/op +WorkloadPilot 14: 15 op, 268000021.00 ns, 17.8667 ms/op +WorkloadPilot 15: 16 op, 295696591.00 ns, 18.4810 ms/op +WorkloadPilot 16: 32 op, 520235103.00 ns, 16.2573 ms/op + +WorkloadWarmup 1: 32 op, 577150908.00 ns, 18.0360 ms/op +WorkloadWarmup 2: 32 op, 527528803.00 ns, 16.4853 ms/op +WorkloadWarmup 3: 32 op, 593125393.00 ns, 18.5352 ms/op + +// BeforeActualRun +WorkloadActual 1: 32 op, 529499995.00 ns, 16.5469 ms/op +WorkloadActual 2: 32 op, 547359372.00 ns, 17.1050 ms/op +WorkloadActual 3: 32 op, 598962612.00 ns, 18.7176 ms/op + +// AfterActualRun +WorkloadResult 1: 32 op, 529499995.00 ns, 16.5469 ms/op +WorkloadResult 2: 32 op, 547359372.00 ns, 17.1050 ms/op +WorkloadResult 3: 32 op, 598962612.00 ns, 18.7176 ms/op +// GC: 3 0 0 527205312 32 +// Threading: 0 0 32 + +// AfterAll +// Benchmark Process 936 has exited with code 0. + +Mean = 17.456 ms, StdErr = 0.651 ms (3.73%), N = 3, StdDev = 1.127 ms +Min = 16.547 ms, Q1 = 16.826 ms, Median = 17.105 ms, Q3 = 17.911 ms, Max = 18.718 ms +IQR = 1.085 ms, LowerFence = 15.198 ms, UpperFence = 19.539 ms +ConfidenceInterval = [-3.108 ms; 38.021 ms] (CI 99.9%), Margin = 20.565 ms (117.81% of Mean) +Skewness = 0.28, Kurtosis = 0.67, MValue = 2 + +// ** Remained 1 (16.7 %) benchmark(s) to run. Estimated finish 2026-11-10 23:35 (0h 0m from now) ** +// ************************** +// Benchmark: StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet SharpEquations.Benchmarks-ShortRun-1.dll --anonymousPipes 135 136 --benchmarkName SharpEquations.Benchmarks.StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform --job ShortRun --benchmarkId 5 in /home/user/SharpEquations/benchmarks/SharpEquations.Benchmarks/bin/Release/net10.0/SharpEquations.Benchmarks-ShortRun-1/bin/Release/net10.0 +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.8 +// Runtime=.NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX512 BITALG+VBMI2+VNNI+VPOPCNTDQ,AVX512 IFMA+VBMI,AVX512 F+BW+CD+DQ+VL,AVX2+BMI1+BMI2+F16C+FMA+LZCNT+MOVBE,AVX,SSE3+SSSE3+SSE4.1+SSE4.2+POPCNT,X86Base+SSE+SSE2,AES+PCLMUL,AvxVnni,SERIALIZE VectorSize=256 +// Job: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) + +OverheadJitting 1: 1 op, 333274.00 ns, 333.2740 us/op +WorkloadJitting 1: 1 op, 1115577730.00 ns, 1.1156 s/op + +OverheadJitting 2: 1 op, 1844.00 ns, 1.8440 us/op +WorkloadJitting 2: 1 op, 119422050.00 ns, 119.4221 ms/op + +WorkloadPilot 1: 2 op, 231102031.00 ns, 115.5510 ms/op +WorkloadPilot 2: 3 op, 340650041.00 ns, 113.5500 ms/op +WorkloadPilot 3: 4 op, 451026782.00 ns, 112.7567 ms/op +WorkloadPilot 4: 5 op, 322081842.00 ns, 64.4164 ms/op +WorkloadPilot 5: 6 op, 310948432.00 ns, 51.8247 ms/op +WorkloadPilot 6: 7 op, 337854320.00 ns, 48.2649 ms/op +WorkloadPilot 7: 8 op, 376773598.00 ns, 47.0967 ms/op +WorkloadPilot 8: 9 op, 444268536.00 ns, 49.3632 ms/op +WorkloadPilot 9: 10 op, 414148375.00 ns, 41.4148 ms/op +WorkloadPilot 10: 11 op, 472196865.00 ns, 42.9270 ms/op +WorkloadPilot 11: 12 op, 511282001.00 ns, 42.6068 ms/op + +WorkloadWarmup 1: 12 op, 526630980.00 ns, 43.8859 ms/op +WorkloadWarmup 2: 12 op, 522916378.00 ns, 43.5764 ms/op +WorkloadWarmup 3: 12 op, 527390186.00 ns, 43.9492 ms/op + +// BeforeActualRun +WorkloadActual 1: 12 op, 517102425.00 ns, 43.0919 ms/op +WorkloadActual 2: 12 op, 485641910.00 ns, 40.4702 ms/op +WorkloadActual 3: 12 op, 508621504.00 ns, 42.3851 ms/op + +// AfterActualRun +WorkloadResult 1: 12 op, 517102425.00 ns, 43.0919 ms/op +WorkloadResult 2: 12 op, 485641910.00 ns, 40.4702 ms/op +WorkloadResult 3: 12 op, 508621504.00 ns, 42.3851 ms/op +// GC: 1 0 0 262805088 12 +// Threading: 0 0 12 + +// AfterAll +// Benchmark Process 952 has exited with code 0. + +Mean = 41.982 ms, StdErr = 0.783 ms (1.87%), N = 3, StdDev = 1.356 ms +Min = 40.470 ms, Q1 = 41.428 ms, Median = 42.385 ms, Q3 = 42.738 ms, Max = 43.092 ms +IQR = 1.311 ms, LowerFence = 39.461 ms, UpperFence = 44.705 ms +ConfidenceInterval = [17.235 ms; 66.729 ms] (CI 99.9%), Margin = 24.747 ms (58.95% of Mean) +Skewness = -0.27, Kurtosis = 0.67, MValue = 2 + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2026-11-10 23:35 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html + +// * Detailed results * +StylesheetBenchmarks.Omml2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 20.815 ms, StdErr = 0.612 ms (2.94%), N = 3, StdDev = 1.060 ms +Min = 19.623 ms, Q1 = 20.396 ms, Median = 21.169 ms, Q3 = 21.411 ms, Max = 21.653 ms +IQR = 1.015 ms, LowerFence = 18.874 ms, UpperFence = 22.934 ms +ConfidenceInterval = [1.473 ms; 40.158 ms] (CI 99.9%), Margin = 19.342 ms (92.92% of Mean) +Skewness = -0.3, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[18.659 ms ; 20.446 ms) | @ +[20.446 ms ; 22.618 ms) | @@ +--------------------------------------------------- + +StylesheetBenchmarks.Omml2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 70.624 ms, StdErr = 5.067 ms (7.17%), N = 3, StdDev = 8.777 ms +Min = 65.537 ms, Q1 = 65.557 ms, Median = 65.577 ms, Q3 = 73.167 ms, Max = 80.758 ms +IQR = 7.611 ms, LowerFence = 54.140 ms, UpperFence = 84.584 ms +ConfidenceInterval = [-89.495 ms; 230.743 ms] (CI 99.9%), Margin = 160.119 ms (226.72% of Mean) +Skewness = 0.38, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[65.160 ms ; 81.134 ms) | @@@ +--------------------------------------------------- + +StylesheetBenchmarks.MathML2Omml: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 31.031 ms, StdErr = 1.602 ms (5.16%), N = 3, StdDev = 2.775 ms +Min = 29.067 ms, Q1 = 29.444 ms, Median = 29.821 ms, Q3 = 32.014 ms, Max = 34.206 ms +IQR = 2.570 ms, LowerFence = 25.590 ms, UpperFence = 35.868 ms +ConfidenceInterval = [-19.594 ms; 81.657 ms] (CI 99.9%), Margin = 50.626 ms (163.14% of Mean) +Skewness = 0.35, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[26.541 ms ; 31.969 ms) | @@ +[31.969 ms ; 36.731 ms) | @ +--------------------------------------------------- + +StylesheetBenchmarks.MathML2OmmlXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 74.669 ms, StdErr = 0.810 ms (1.08%), N = 3, StdDev = 1.403 ms +Min = 73.067 ms, Q1 = 74.165 ms, Median = 75.264 ms, Q3 = 75.470 ms, Max = 75.676 ms +IQR = 1.305 ms, LowerFence = 72.208 ms, UpperFence = 77.427 ms +ConfidenceInterval = [49.078 ms; 100.260 ms] (CI 99.9%), Margin = 25.591 ms (34.27% of Mean) +Skewness = -0.35, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[71.790 ms ; 74.193 ms) | @ +[74.193 ms ; 76.953 ms) | @@ +--------------------------------------------------- + +StylesheetBenchmarks.Mtef2MathML: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 17.456 ms, StdErr = 0.651 ms (3.73%), N = 3, StdDev = 1.127 ms +Min = 16.547 ms, Q1 = 16.826 ms, Median = 17.105 ms, Q3 = 17.911 ms, Max = 18.718 ms +IQR = 1.085 ms, LowerFence = 15.198 ms, UpperFence = 19.539 ms +ConfidenceInterval = [-3.108 ms; 38.021 ms] (CI 99.9%), Margin = 20.565 ms (117.81% of Mean) +Skewness = 0.28, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[15.800 ms ; 17.852 ms) | @@ +[17.852 ms ; 19.743 ms) | @ +--------------------------------------------------- + +StylesheetBenchmarks.Mtef2MathMLXslCompiledTransform: ShortRun(IterationCount=3, LaunchCount=1, WarmupCount=3) +Runtime = .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4; GC = Concurrent Workstation +Mean = 41.982 ms, StdErr = 0.783 ms (1.87%), N = 3, StdDev = 1.356 ms +Min = 40.470 ms, Q1 = 41.428 ms, Median = 42.385 ms, Q3 = 42.738 ms, Max = 43.092 ms +IQR = 1.311 ms, LowerFence = 39.461 ms, UpperFence = 44.705 ms +ConfidenceInterval = [17.235 ms; 66.729 ms] (CI 99.9%), Margin = 24.747 ms (58.95% of Mean) +Skewness = -0.27, Kurtosis = 0.67, MValue = 2 +-------------------- Histogram -------------------- +[39.236 ms ; 41.504 ms) | @ +[41.504 ms ; 44.326 ms) | @@ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) +Intel Xeon Processor 2.10GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 10.0.114 + [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 + +Job=ShortRun IterationCount=3 LaunchCount=1 +WarmupCount=3 + +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|-------------------------------- |---------:|----------:|---------:|----------:|----------:| +| Omml2MathML | 20.82 ms | 19.34 ms | 1.060 ms | 250.0000 | 35.68 MB | +| Omml2MathMLXslCompiledTransform | 70.62 ms | 160.12 ms | 8.777 ms | 1000.0000 | 156.37 MB | +| MathML2Omml | 31.03 ms | 50.63 ms | 2.775 ms | - | 30.23 MB | +| MathML2OmmlXslCompiledTransform | 74.67 ms | 25.59 ms | 1.403 ms | 1000.0000 | 136.31 MB | +| Mtef2MathML | 17.46 ms | 20.56 ms | 1.127 ms | 93.7500 | 15.71 MB | +| Mtef2MathMLXslCompiledTransform | 41.98 ms | 24.75 ms | 1.356 ms | 83.3333 | 20.89 MB | + +// * Legends * + Mean : Arithmetic mean of all measurements + Error : Half of 99.9% confidence interval + StdDev : Standard deviation of all measurements + Gen0 : GC Generation 0 collects per 1000 operations + Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) + 1 ms : 1 Millisecond (0.001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:58 (58.12 sec), executed benchmarks: 6 + +Global total time: 00:01:45 (105.8 sec), executed benchmarks: 6 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md index 9c2a80e..f88da75 100644 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md @@ -1,7 +1,7 @@ ``` BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) -Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +Intel Xeon Processor 2.10GHz, 1 CPU, 4 logical and 4 physical cores .NET SDK 10.0.114 [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 @@ -10,11 +10,11 @@ Job=ShortRun IterationCount=3 LaunchCount=1 WarmupCount=3 ``` -| Method | Mean | Error | StdDev | Gen0 | Allocated | -|-------------------------------- |----------:|----------:|----------:|----------:|----------:| -| Omml2MathML | 206.15 ms | 353.93 ms | 19.400 ms | 1666.6667 | 461.45 MB | -| Omml2MathMLXslCompiledTransform | 65.30 ms | 49.96 ms | 2.738 ms | 500.0000 | 156.44 MB | -| MathML2Omml | 140.78 ms | 13.86 ms | 0.760 ms | 1000.0000 | 261.16 MB | -| MathML2OmmlXslCompiledTransform | 72.10 ms | 114.18 ms | 6.259 ms | 500.0000 | 136.35 MB | -| Mtef2MathML | 85.12 ms | 34.89 ms | 1.913 ms | 222.2222 | 79.9 MB | -| Mtef2MathMLXslCompiledTransform | 35.28 ms | 18.50 ms | 1.014 ms | - | 20.89 MB | +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|-------------------------------- |---------:|----------:|---------:|----------:|----------:| +| Omml2MathML | 20.82 ms | 19.34 ms | 1.060 ms | 250.0000 | 35.68 MB | +| Omml2MathMLXslCompiledTransform | 70.62 ms | 160.12 ms | 8.777 ms | 1000.0000 | 156.37 MB | +| MathML2Omml | 31.03 ms | 50.63 ms | 2.775 ms | - | 30.23 MB | +| MathML2OmmlXslCompiledTransform | 74.67 ms | 25.59 ms | 1.403 ms | 1000.0000 | 136.31 MB | +| Mtef2MathML | 17.46 ms | 20.56 ms | 1.127 ms | 93.7500 | 15.71 MB | +| Mtef2MathMLXslCompiledTransform | 41.98 ms | 24.75 ms | 1.356 ms | 83.3333 | 20.89 MB | diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv index 1dcae01..c4e293b 100644 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv @@ -1,7 +1,7 @@ Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Gen0,Allocated -Omml2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,206.15 ms,353.93 ms,19.400 ms,1666.6667,461.45 MB -Omml2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,65.30 ms,49.96 ms,2.738 ms,500.0000,156.44 MB -MathML2Omml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,140.78 ms,13.86 ms,0.760 ms,1000.0000,261.16 MB -MathML2OmmlXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,72.10 ms,114.18 ms,6.259 ms,500.0000,136.35 MB -Mtef2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,85.12 ms,34.89 ms,1.913 ms,222.2222,79.9 MB -Mtef2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,35.28 ms,18.50 ms,1.014 ms,0.0000,20.89 MB +Omml2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,20.82 ms,19.34 ms,1.060 ms,250.0000,35.68 MB +Omml2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,70.62 ms,160.12 ms,8.777 ms,1000.0000,156.37 MB +MathML2Omml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,31.03 ms,50.63 ms,2.775 ms,0.0000,30.23 MB +MathML2OmmlXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,74.67 ms,25.59 ms,1.403 ms,1000.0000,136.31 MB +Mtef2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,17.46 ms,20.56 ms,1.127 ms,93.7500,15.71 MB +Mtef2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,41.98 ms,24.75 ms,1.356 ms,83.3333,20.89 MB diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html index 51f050a..9daa783 100644 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html @@ -2,7 +2,7 @@ -SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-124057 +SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-233417 + + +

+BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
+Intel Xeon Processor 2.10GHz, 1 CPU, 4 logical and 4 physical cores
+.NET SDK 10.0.114
+  [Host]   : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4
+  ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4
+
+
Job=ShortRun  IterationCount=3  LaunchCount=1  
+WarmupCount=3  
+
+ + + + + + + + +
Method MeanErrorStdDevGen0Allocated
UnicodeMathToOmml401.20 μs1,057.16 μs57.946 μs1.3550219.93 KB
OmmlToMathML23.52 μs11.55 μs0.633 μs0.244134.35 KB
OmmlToUnicodeMath249.92 μs626.42 μs34.336 μs-96.29 KB
OmmlToLaTeX28.39 μs13.31 μs0.730 μs0.162826.79 KB
+ + diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md index f88da75..679055a 100644 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md @@ -10,11 +10,11 @@ Job=ShortRun IterationCount=3 LaunchCount=1 WarmupCount=3 ``` -| Method | Mean | Error | StdDev | Gen0 | Allocated | -|-------------------------------- |---------:|----------:|---------:|----------:|----------:| -| Omml2MathML | 20.82 ms | 19.34 ms | 1.060 ms | 250.0000 | 35.68 MB | -| Omml2MathMLXslCompiledTransform | 70.62 ms | 160.12 ms | 8.777 ms | 1000.0000 | 156.37 MB | -| MathML2Omml | 31.03 ms | 50.63 ms | 2.775 ms | - | 30.23 MB | -| MathML2OmmlXslCompiledTransform | 74.67 ms | 25.59 ms | 1.403 ms | 1000.0000 | 136.31 MB | -| Mtef2MathML | 17.46 ms | 20.56 ms | 1.127 ms | 93.7500 | 15.71 MB | -| Mtef2MathMLXslCompiledTransform | 41.98 ms | 24.75 ms | 1.356 ms | 83.3333 | 20.89 MB | +| Method | Mean | Error | StdDev | Gen0 | Allocated | +|-------------------------------- |----------:|-----------:|----------:|----------:|----------:| +| Omml2MathML | 9.995 ms | 8.776 ms | 0.4810 ms | 62.5000 | 9.59 MB | +| Omml2MathMLXslCompiledTransform | 83.120 ms | 102.319 ms | 5.6084 ms | 1000.0000 | 156.37 MB | +| MathML2Omml | 15.615 ms | 23.374 ms | 1.2812 ms | 125.0000 | 16.51 MB | +| MathML2OmmlXslCompiledTransform | 75.872 ms | 79.438 ms | 4.3543 ms | 1000.0000 | 136.31 MB | +| Mtef2MathML | 23.969 ms | 115.622 ms | 6.3376 ms | - | 15.6 MB | +| Mtef2MathMLXslCompiledTransform | 45.099 ms | 5.842 ms | 0.3202 ms | 90.9091 | 20.89 MB | diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv index c4e293b..aa5dc8f 100644 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv @@ -1,7 +1,7 @@ Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Gen0,Allocated -Omml2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,20.82 ms,19.34 ms,1.060 ms,250.0000,35.68 MB -Omml2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,70.62 ms,160.12 ms,8.777 ms,1000.0000,156.37 MB -MathML2Omml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,31.03 ms,50.63 ms,2.775 ms,0.0000,30.23 MB -MathML2OmmlXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,74.67 ms,25.59 ms,1.403 ms,1000.0000,136.31 MB -Mtef2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,17.46 ms,20.56 ms,1.127 ms,93.7500,15.71 MB -Mtef2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,41.98 ms,24.75 ms,1.356 ms,83.3333,20.89 MB +Omml2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,9.995 ms,8.776 ms,0.4810 ms,62.5000,9.59 MB +Omml2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,83.120 ms,102.319 ms,5.6084 ms,1000.0000,156.37 MB +MathML2Omml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,15.615 ms,23.374 ms,1.2812 ms,125.0000,16.51 MB +MathML2OmmlXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,75.872 ms,79.438 ms,4.3543 ms,1000.0000,136.31 MB +Mtef2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,23.969 ms,115.622 ms,6.3376 ms,0.0000,15.6 MB +Mtef2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,45.099 ms,5.842 ms,0.3202 ms,90.9091,20.89 MB diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html index 9daa783..33d3335 100644 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html +++ b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html @@ -2,7 +2,7 @@ -SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-233417 +SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-235046 - - -

-BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
-Intel Xeon Processor 2.10GHz, 1 CPU, 4 logical and 4 physical cores
-.NET SDK 10.0.114
-  [Host]   : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4
-  ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4
-
-
Job=ShortRun  IterationCount=3  LaunchCount=1  
-WarmupCount=3  
-
- - - - - - - - -
Method MeanErrorStdDevGen0Allocated
UnicodeMathToOmml401.20 μs1,057.16 μs57.946 μs1.3550219.93 KB
OmmlToMathML23.52 μs11.55 μs0.633 μs0.244134.35 KB
OmmlToUnicodeMath249.92 μs626.42 μs34.336 μs-96.29 KB
OmmlToLaTeX28.39 μs13.31 μs0.730 μs0.162826.79 KB
- - diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md deleted file mode 100644 index 679055a..0000000 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report-github.md +++ /dev/null @@ -1,20 +0,0 @@ -``` - -BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat) -Intel Xeon Processor 2.10GHz, 1 CPU, 4 logical and 4 physical cores -.NET SDK 10.0.114 - [Host] : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 - ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4 - -Job=ShortRun IterationCount=3 LaunchCount=1 -WarmupCount=3 - -``` -| Method | Mean | Error | StdDev | Gen0 | Allocated | -|-------------------------------- |----------:|-----------:|----------:|----------:|----------:| -| Omml2MathML | 9.995 ms | 8.776 ms | 0.4810 ms | 62.5000 | 9.59 MB | -| Omml2MathMLXslCompiledTransform | 83.120 ms | 102.319 ms | 5.6084 ms | 1000.0000 | 156.37 MB | -| MathML2Omml | 15.615 ms | 23.374 ms | 1.2812 ms | 125.0000 | 16.51 MB | -| MathML2OmmlXslCompiledTransform | 75.872 ms | 79.438 ms | 4.3543 ms | 1000.0000 | 136.31 MB | -| Mtef2MathML | 23.969 ms | 115.622 ms | 6.3376 ms | - | 15.6 MB | -| Mtef2MathMLXslCompiledTransform | 45.099 ms | 5.842 ms | 0.3202 ms | 90.9091 | 20.89 MB | diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv deleted file mode 100644 index aa5dc8f..0000000 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.csv +++ /dev/null @@ -1,7 +0,0 @@ -Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Gen0,Allocated -Omml2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,9.995 ms,8.776 ms,0.4810 ms,62.5000,9.59 MB -Omml2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,83.120 ms,102.319 ms,5.6084 ms,1000.0000,156.37 MB -MathML2Omml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,15.615 ms,23.374 ms,1.2812 ms,125.0000,16.51 MB -MathML2OmmlXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,75.872 ms,79.438 ms,4.3543 ms,1000.0000,136.31 MB -Mtef2MathML,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,23.969 ms,115.622 ms,6.3376 ms,0.0000,15.6 MB -Mtef2MathMLXslCompiledTransform,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 10.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,45.099 ms,5.842 ms,0.3202 ms,90.9091,20.89 MB diff --git a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html b/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html deleted file mode 100644 index 33d3335..0000000 --- a/benchmarks/SharpEquations.Benchmarks/BenchmarkDotNet.Artifacts/results/SharpEquations.Benchmarks.StylesheetBenchmarks-report.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - -SharpEquations.Benchmarks.StylesheetBenchmarks-20261110-235046 - - - - -

-BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
-Intel Xeon Processor 2.10GHz, 1 CPU, 4 logical and 4 physical cores
-.NET SDK 10.0.114
-  [Host]   : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4
-  ShortRun : .NET 10.0.14 (10.0.14, 10.0.1426.52326), X64 RyuJIT x86-64-v4
-
-
Job=ShortRun  IterationCount=3  LaunchCount=1  
-WarmupCount=3  
-
- - - - - - - - - - -
Method MeanErrorStdDevGen0Allocated
Omml2MathML9.995 ms8.776 ms0.4810 ms62.50009.59 MB
Omml2MathMLXslCompiledTransform83.120 ms102.319 ms5.6084 ms1000.0000156.37 MB
MathML2Omml15.615 ms23.374 ms1.2812 ms125.000016.51 MB
MathML2OmmlXslCompiledTransform75.872 ms79.438 ms4.3543 ms1000.0000136.31 MB
Mtef2MathML23.969 ms115.622 ms6.3376 ms-15.6 MB
Mtef2MathMLXslCompiledTransform45.099 ms5.842 ms0.3202 ms90.909120.89 MB
- -