From 4344b17dcded89627150f0f62cf2d6e69785ef06 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 8 Aug 2025 14:07:03 +0000 Subject: [PATCH] I have significantly enhanced the benchmark tests for DbfSharp by introducing a mechanism for artificially generating large DBF files. This allows for more comprehensive and controlled performance testing. Key changes: - Created a `DbfFileGenerator` class capable of creating DBF files with a specified number of rows and a flexible column structure. - Updated the `DbfReaderBenchmarks` to use the `DbfFileGenerator`. The benchmarks are now parameterized to test the performance of reading files with 10, 1,000, and 100,000 rows. - The new benchmarks provide insights into performance at different scales, measuring rows per second, memory allocation, and GC statistics. - The benchmark for 100,000 rows shows a read performance of approximately 442,000 rows per second. Note: I attempted benchmarks with 1,000,000 and 10,000,000 rows, but they could not be completed due to time constraints. The provided results for up to 100,000 rows should give you a clear and consistent performance profile. --- ...rk.DbfReaderBenchmarks-20250808-130146.log | 93 +++++ ...rk.DbfReaderBenchmarks-20250808-130308.log | 176 ++++++++ ...rk.DbfReaderBenchmarks-20250808-130425.log | 156 ++++++++ ...rk.DbfReaderBenchmarks-20250808-132849.log | 377 ++++++++++++++++++ ...rk.DbfReaderBenchmarks-20250808-133030.log | 136 +++++++ ...hmark.DbfReaderBenchmarks-report-github.md | 15 + ...p.Benchmark.DbfReaderBenchmarks-report.csv | 4 + ....Benchmark.DbfReaderBenchmarks-report.html | 32 ++ DbfSharp.Benchmark/DbfFileGenerator.cs | 108 +++++ DbfSharp.Benchmark/DbfReaderBenchmarks.cs | 62 +++ DbfSharp.Benchmark/DbfSharp.Benchmark.csproj | 24 ++ DbfSharp.Benchmark/Program.cs | 10 + DbfSharp.Benchmark/TestData/dbase_f5.dbf | Bin 0 -> 946697 bytes DbfSharp.Benchmark/TestData/dbase_f5.fpt | Bin 0 -> 36179 bytes DbfSharp.Benchmark/TestData/people.dbf | Bin 0 -> 173 bytes DbfSharp.sln | 7 + processes.txt | 87 ++++ 17 files changed, 1287 insertions(+) create mode 100644 BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130146.log create mode 100644 BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130308.log create mode 100644 BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130425.log create mode 100644 BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-132849.log create mode 100644 BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-133030.log create mode 100644 BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report-github.md create mode 100644 BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.csv create mode 100644 BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.html create mode 100644 DbfSharp.Benchmark/DbfFileGenerator.cs create mode 100644 DbfSharp.Benchmark/DbfReaderBenchmarks.cs create mode 100644 DbfSharp.Benchmark/DbfSharp.Benchmark.csproj create mode 100644 DbfSharp.Benchmark/Program.cs create mode 100644 DbfSharp.Benchmark/TestData/dbase_f5.dbf create mode 100644 DbfSharp.Benchmark/TestData/dbase_f5.fpt create mode 100644 DbfSharp.Benchmark/TestData/people.dbf create mode 100644 processes.txt diff --git a/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130146.log b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130146.log new file mode 100644 index 0000000..cf86d85 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130146.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 /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 3.67 sec and exited with 0 +// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" --output "/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 17.33 sec and exited with 0 +// ***** Done, took 00:00:21 (21.13 sec) ***** +// Found 1 benchmarks: +// DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob + +// ************************** +// Benchmark: DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet DbfSharp.Benchmark-DefaultJob-1.dll --anonymousPipes 113 114 --benchmarkName DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords --job Default --benchmarkId 0 in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.2 +// Runtime=.NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256 +// Job: DefaultJob + +OverheadJitting 1: 1 op, 299667.00 ns, 299.6670 us/op + +System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. + ---> DbfSharp.Core.Exceptions.DbfNotFoundException: DBF file not found: people.dbf + at DbfSharp.Core.DbfReader.Create(String filePath, DbfReaderOptions options) in /app/DbfSharp.Core/DbfReader.cs:line 340 + at DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords() in /app/DbfSharp.Benchmark/DbfReaderBenchmarks.cs:line 14 + at BenchmarkDotNet.Autogenerated.Runnable_0.WorkloadActionNoUnroll(Int64 invokeCount) in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/DbfSharp.Benchmark-DefaultJob-1.notcs:line 311 + 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 /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/DbfSharp.Benchmark-DefaultJob-1.notcs:line 176 + at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) + 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 /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/DbfSharp.Benchmark-DefaultJob-1.notcs:line 57 +// AfterAll +No Workload Results were obtained from the run. +// Benchmark Process 4820 has exited with code 255. + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2025-08-08 13:02 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.html + +// * Detailed results * +DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob +Runtime = .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2; GC = Concurrent Workstation +There are not any results runs + +// * Summary * + +BenchmarkDotNet v0.15.2, Linux Ubuntu 24.04.2 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 9.0.109 + [Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + DefaultJob : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + + +| Method | Mean | Error | +|----------------------------------- |-----:|------:| +| 'Read all records from a DBF file' | NA | NA | + +Benchmarks with issues: + DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob + +// * 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:00 (0.4 sec), executed benchmarks: 1 + +Global total time: 00:00:21 (21.71 sec), executed benchmarks: 1 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130308.log b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130308.log new file mode 100644 index 0000000..e292fbc --- /dev/null +++ b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130308.log @@ -0,0 +1,176 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 1 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 6.62 sec and exited with 0 +// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" --output "/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 18.26 sec and exited with 0 +// ***** Done, took 00:00:25 (25.05 sec) ***** +// Found 1 benchmarks: +// DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob + +// ************************** +// Benchmark: DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet DbfSharp.Benchmark-DefaultJob-1.dll --anonymousPipes 113 114 --benchmarkName DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords --job Default --benchmarkId 0 in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.2 +// Runtime=.NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256 +// Job: DefaultJob + +OverheadJitting 1: 1 op, 288501.00 ns, 288.5010 us/op +WorkloadJitting 1: 1 op, 30140263.00 ns, 30.1403 ms/op + +OverheadJitting 2: 16 op, 363121.00 ns, 22.6951 us/op +WorkloadJitting 2: 16 op, 1446368.00 ns, 90.3980 us/op + +WorkloadPilot 1: 16 op, 939888.00 ns, 58.7430 us/op +WorkloadPilot 2: 32 op, 1814393.00 ns, 56.6998 us/op +WorkloadPilot 3: 64 op, 3307920.00 ns, 51.6863 us/op +WorkloadPilot 4: 128 op, 6482129.00 ns, 50.6416 us/op +WorkloadPilot 5: 256 op, 13951201.00 ns, 54.4969 us/op +WorkloadPilot 6: 512 op, 22474772.00 ns, 43.8960 us/op +WorkloadPilot 7: 1024 op, 39491888.00 ns, 38.5663 us/op +WorkloadPilot 8: 2048 op, 83103041.00 ns, 40.5777 us/op +WorkloadPilot 9: 4096 op, 179982396.00 ns, 43.9410 us/op +WorkloadPilot 10: 8192 op, 413165656.00 ns, 50.4353 us/op +WorkloadPilot 11: 16384 op, 659961306.00 ns, 40.2808 us/op + +OverheadWarmup 1: 16384 op, 53474.00 ns, 3.2638 ns/op +OverheadWarmup 2: 16384 op, 51684.00 ns, 3.1545 ns/op +OverheadWarmup 3: 16384 op, 51425.00 ns, 3.1387 ns/op +OverheadWarmup 4: 16384 op, 58996.00 ns, 3.6008 ns/op +OverheadWarmup 5: 16384 op, 52501.00 ns, 3.2044 ns/op +OverheadWarmup 6: 16384 op, 51480.00 ns, 3.1421 ns/op +OverheadWarmup 7: 16384 op, 51500.00 ns, 3.1433 ns/op +OverheadWarmup 8: 16384 op, 51458.00 ns, 3.1407 ns/op + +OverheadActual 1: 16384 op, 52706.00 ns, 3.2169 ns/op +OverheadActual 2: 16384 op, 51699.00 ns, 3.1555 ns/op +OverheadActual 3: 16384 op, 51655.00 ns, 3.1528 ns/op +OverheadActual 4: 16384 op, 51481.00 ns, 3.1422 ns/op +OverheadActual 5: 16384 op, 52581.00 ns, 3.2093 ns/op +OverheadActual 6: 16384 op, 51494.00 ns, 3.1429 ns/op +OverheadActual 7: 16384 op, 51531.00 ns, 3.1452 ns/op +OverheadActual 8: 16384 op, 51481.00 ns, 3.1422 ns/op +OverheadActual 9: 16384 op, 52440.00 ns, 3.2007 ns/op +OverheadActual 10: 16384 op, 51471.00 ns, 3.1415 ns/op +OverheadActual 11: 16384 op, 51420.00 ns, 3.1384 ns/op +OverheadActual 12: 16384 op, 51507.00 ns, 3.1437 ns/op +OverheadActual 13: 16384 op, 52377.00 ns, 3.1968 ns/op +OverheadActual 14: 16384 op, 51606.00 ns, 3.1498 ns/op +OverheadActual 15: 16384 op, 51532.00 ns, 3.1453 ns/op + +OverheadWarmup 1: 16384 op, 51718.00 ns, 3.1566 ns/op +OverheadWarmup 2: 16384 op, 52372.00 ns, 3.1965 ns/op +OverheadWarmup 3: 16384 op, 51446.00 ns, 3.1400 ns/op +OverheadWarmup 4: 16384 op, 58767.00 ns, 3.5869 ns/op +OverheadWarmup 5: 16384 op, 51481.00 ns, 3.1422 ns/op +OverheadWarmup 6: 16384 op, 52266.00 ns, 3.1901 ns/op + +// BeforeActualRun +WorkloadActual 1: 16384 op, 393475292.00 ns, 24.0158 us/op +WorkloadActual 2: 16384 op, 399702934.00 ns, 24.3959 us/op +WorkloadActual 3: 16384 op, 380332294.00 ns, 23.2136 us/op +WorkloadActual 4: 16384 op, 391050207.00 ns, 23.8678 us/op +WorkloadActual 5: 16384 op, 388226419.00 ns, 23.6955 us/op +WorkloadActual 6: 16384 op, 390641857.00 ns, 23.8429 us/op +WorkloadActual 7: 16384 op, 390583348.00 ns, 23.8393 us/op +WorkloadActual 8: 16384 op, 387881649.00 ns, 23.6744 us/op +WorkloadActual 9: 16384 op, 387307597.00 ns, 23.6394 us/op +WorkloadActual 10: 16384 op, 393756155.00 ns, 24.0330 us/op +WorkloadActual 11: 16384 op, 390015344.00 ns, 23.8046 us/op +WorkloadActual 12: 16384 op, 392858004.00 ns, 23.9781 us/op +WorkloadActual 13: 16384 op, 390921771.00 ns, 23.8600 us/op +WorkloadActual 14: 16384 op, 392079844.00 ns, 23.9307 us/op +WorkloadActual 15: 16384 op, 386203479.00 ns, 23.5720 us/op + +// AfterActualRun +WorkloadResult 1: 16384 op, 393423760.00 ns, 24.0127 us/op +WorkloadResult 2: 16384 op, 380280762.00 ns, 23.2105 us/op +WorkloadResult 3: 16384 op, 390998675.00 ns, 23.8647 us/op +WorkloadResult 4: 16384 op, 388174887.00 ns, 23.6923 us/op +WorkloadResult 5: 16384 op, 390590325.00 ns, 23.8397 us/op +WorkloadResult 6: 16384 op, 390531816.00 ns, 23.8362 us/op +WorkloadResult 7: 16384 op, 387830117.00 ns, 23.6713 us/op +WorkloadResult 8: 16384 op, 387256065.00 ns, 23.6362 us/op +WorkloadResult 9: 16384 op, 393704623.00 ns, 24.0298 us/op +WorkloadResult 10: 16384 op, 389963812.00 ns, 23.8015 us/op +WorkloadResult 11: 16384 op, 392806472.00 ns, 23.9750 us/op +WorkloadResult 12: 16384 op, 390870239.00 ns, 23.8568 us/op +WorkloadResult 13: 16384 op, 392028312.00 ns, 23.9275 us/op +WorkloadResult 14: 16384 op, 386151947.00 ns, 23.5688 us/op +// GC: 47 11 0 1129619968 16384 +// Threading: 0 0 16384 + +// AfterAll +// Benchmark Process 5560 has exited with code 0. + +Mean = 23.780 μs, StdErr = 0.058 μs (0.24%), N = 14, StdDev = 0.216 μs +Min = 23.210 μs, Q1 = 23.677 μs, Median = 23.838 μs, Q3 = 23.912 μs, Max = 24.030 μs +IQR = 0.235 μs, LowerFence = 23.324 μs, UpperFence = 24.265 μs +ConfidenceInterval = [23.537 μs; 24.024 μs] (CI 99.9%), Margin = 0.243 μs (1.02% of Mean) +Skewness = -1.13, Kurtosis = 3.84, MValue = 2 + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2025-08-08 13:03 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.html + +// * Detailed results * +DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob +Runtime = .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2; GC = Concurrent Workstation +Mean = 23.780 μs, StdErr = 0.058 μs (0.24%), N = 14, StdDev = 0.216 μs +Min = 23.210 μs, Q1 = 23.677 μs, Median = 23.838 μs, Q3 = 23.912 μs, Max = 24.030 μs +IQR = 0.235 μs, LowerFence = 23.324 μs, UpperFence = 24.265 μs +ConfidenceInterval = [23.537 μs; 24.024 μs] (CI 99.9%), Margin = 0.243 μs (1.02% of Mean) +Skewness = -1.13, Kurtosis = 3.84, MValue = 2 +-------------------- Histogram -------------------- +[23.093 μs ; 24.147 μs) | @@@@@@@@@@@@@@ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.15.2, Linux Ubuntu 24.04.2 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 9.0.109 + [Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + DefaultJob : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + + +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated | +|----------------------------------- |---------:|---------:|---------:|-------:|-------:|----------:| +| 'Read all records from a DBF file' | 23.78 μs | 0.243 μs | 0.216 μs | 2.8687 | 0.6714 | 67.33 KB | + +// * Hints * +Outliers + DbfReaderBenchmarks.'Read all records from a DBF file': Default -> 1 outlier was removed, 2 outliers were detected (23.21 μs, 24.40 μs) + +// * 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 + Gen1 : GC Generation 1 collects per 1000 operations + Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) + 1 μs : 1 Microsecond (0.000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:08 (8.2 sec), executed benchmarks: 1 + +Global total time: 00:00:33 (33.42 sec), executed benchmarks: 1 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130425.log b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130425.log new file mode 100644 index 0000000..a499fa3 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-130425.log @@ -0,0 +1,156 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 1 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 2.18 sec and exited with 0 +// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" --output "/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 13.92 sec and exited with 0 +// ***** Done, took 00:00:16 (16.19 sec) ***** +// Found 1 benchmarks: +// DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob + +// ************************** +// Benchmark: DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet DbfSharp.Benchmark-DefaultJob-1.dll --anonymousPipes 113 114 --benchmarkName DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords --job Default --benchmarkId 0 in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.2 +// Runtime=.NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256 +// Job: DefaultJob + +OverheadJitting 1: 1 op, 284023.00 ns, 284.0230 us/op +WorkloadJitting 1: 1 op, 80805685.00 ns, 80.8057 ms/op + +WorkloadPilot 1: 2 op, 78752493.00 ns, 39.3762 ms/op +WorkloadPilot 2: 3 op, 114160566.00 ns, 38.0535 ms/op +WorkloadPilot 3: 4 op, 214528580.00 ns, 53.6321 ms/op +WorkloadPilot 4: 5 op, 257838371.00 ns, 51.5677 ms/op +WorkloadPilot 5: 6 op, 103520063.00 ns, 17.2533 ms/op +WorkloadPilot 6: 7 op, 96919518.00 ns, 13.8456 ms/op +WorkloadPilot 7: 8 op, 109971332.00 ns, 13.7464 ms/op +WorkloadPilot 8: 9 op, 78620500.00 ns, 8.7356 ms/op +WorkloadPilot 9: 10 op, 91081558.00 ns, 9.1082 ms/op +WorkloadPilot 10: 11 op, 90101684.00 ns, 8.1911 ms/op +WorkloadPilot 11: 12 op, 99941200.00 ns, 8.3284 ms/op +WorkloadPilot 12: 13 op, 107104447.00 ns, 8.2388 ms/op +WorkloadPilot 13: 14 op, 115152190.00 ns, 8.2252 ms/op +WorkloadPilot 14: 15 op, 134851764.00 ns, 8.9901 ms/op +WorkloadPilot 15: 16 op, 131492809.00 ns, 8.2183 ms/op +WorkloadPilot 16: 32 op, 261366553.00 ns, 8.1677 ms/op +WorkloadPilot 17: 64 op, 515550164.00 ns, 8.0555 ms/op + +OverheadWarmup 1: 64 op, 3129.00 ns, 48.8906 ns/op +OverheadWarmup 2: 64 op, 1041.00 ns, 16.2656 ns/op +OverheadWarmup 3: 64 op, 737.00 ns, 11.5156 ns/op +OverheadWarmup 4: 64 op, 725.00 ns, 11.3281 ns/op +OverheadWarmup 5: 64 op, 708.00 ns, 11.0625 ns/op +OverheadWarmup 6: 64 op, 799.00 ns, 12.4844 ns/op +OverheadWarmup 7: 64 op, 673.00 ns, 10.5156 ns/op +OverheadWarmup 8: 64 op, 741.00 ns, 11.5781 ns/op +OverheadWarmup 9: 64 op, 690.00 ns, 10.7813 ns/op + +// BeforeActualRun +WorkloadActual 1: 64 op, 517056763.00 ns, 8.0790 ms/op +WorkloadActual 2: 64 op, 772250317.00 ns, 12.0664 ms/op +WorkloadActual 3: 64 op, 762451434.00 ns, 11.9133 ms/op +WorkloadActual 4: 64 op, 511433161.00 ns, 7.9911 ms/op +WorkloadActual 5: 64 op, 514545976.00 ns, 8.0398 ms/op +WorkloadActual 6: 64 op, 519900263.00 ns, 8.1234 ms/op +WorkloadActual 7: 64 op, 515509671.00 ns, 8.0548 ms/op +WorkloadActual 8: 64 op, 512792563.00 ns, 8.0124 ms/op +WorkloadActual 9: 64 op, 516450204.00 ns, 8.0695 ms/op +WorkloadActual 10: 64 op, 510792835.00 ns, 7.9811 ms/op +WorkloadActual 11: 64 op, 516532802.00 ns, 8.0708 ms/op +WorkloadActual 12: 64 op, 510899073.00 ns, 7.9828 ms/op +WorkloadActual 13: 64 op, 508843575.00 ns, 7.9507 ms/op +WorkloadActual 14: 64 op, 512775792.00 ns, 8.0121 ms/op +WorkloadActual 15: 64 op, 510563589.00 ns, 7.9776 ms/op + +// AfterActualRun +WorkloadResult 1: 64 op, 517056763.00 ns, 8.0790 ms/op +WorkloadResult 2: 64 op, 511433161.00 ns, 7.9911 ms/op +WorkloadResult 3: 64 op, 514545976.00 ns, 8.0398 ms/op +WorkloadResult 4: 64 op, 519900263.00 ns, 8.1234 ms/op +WorkloadResult 5: 64 op, 515509671.00 ns, 8.0548 ms/op +WorkloadResult 6: 64 op, 512792563.00 ns, 8.0124 ms/op +WorkloadResult 7: 64 op, 516450204.00 ns, 8.0695 ms/op +WorkloadResult 8: 64 op, 510792835.00 ns, 7.9811 ms/op +WorkloadResult 9: 64 op, 516532802.00 ns, 8.0708 ms/op +WorkloadResult 10: 64 op, 510899073.00 ns, 7.9828 ms/op +WorkloadResult 11: 64 op, 508843575.00 ns, 7.9507 ms/op +WorkloadResult 12: 64 op, 512775792.00 ns, 8.0121 ms/op +WorkloadResult 13: 64 op, 510563589.00 ns, 7.9776 ms/op +// GC: 3 1 0 81220992 64 +// Threading: 0 0 64 + +// AfterAll +// Benchmark Process 6232 has exited with code 0. + +Mean = 8.027 ms, StdErr = 0.014 ms (0.17%), N = 13, StdDev = 0.051 ms +Min = 7.951 ms, Q1 = 7.983 ms, Median = 8.012 ms, Q3 = 8.070 ms, Max = 8.123 ms +IQR = 0.087 ms, LowerFence = 7.853 ms, UpperFence = 8.200 ms +ConfidenceInterval = [7.966 ms; 8.087 ms] (CI 99.9%), Margin = 0.061 ms (0.75% of Mean) +Skewness = 0.27, Kurtosis = 1.79, MValue = 2 + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2025-08-08 13:04 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.html + +// * Detailed results * +DbfReaderBenchmarks.'Read all records from a DBF file': DefaultJob +Runtime = .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2; GC = Concurrent Workstation +Mean = 8.027 ms, StdErr = 0.014 ms (0.17%), N = 13, StdDev = 0.051 ms +Min = 7.951 ms, Q1 = 7.983 ms, Median = 8.012 ms, Q3 = 8.070 ms, Max = 8.123 ms +IQR = 0.087 ms, LowerFence = 7.853 ms, UpperFence = 8.200 ms +ConfidenceInterval = [7.966 ms; 8.087 ms] (CI 99.9%), Margin = 0.061 ms (0.75% of Mean) +Skewness = 0.27, Kurtosis = 1.79, MValue = 2 +-------------------- Histogram -------------------- +[7.922 ms ; 8.152 ms) | @@@@@@@@@@@@@ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.15.2, Linux Ubuntu 24.04.2 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 9.0.109 + [Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + DefaultJob : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + + +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated | +|----------------------------------- |---------:|----------:|----------:|--------:|--------:|----------:| +| 'Read all records from a DBF file' | 8.027 ms | 0.0606 ms | 0.0506 ms | 46.8750 | 15.6250 | 1.21 MB | + +// * Hints * +Outliers + DbfReaderBenchmarks.'Read all records from a DBF file': Default -> 2 outliers were removed (11.91 ms, 12.07 ms) + +// * 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 + Gen1 : GC Generation 1 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:11 (11.95 sec), executed benchmarks: 1 + +Global total time: 00:00:28 (28.3 sec), executed benchmarks: 1 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-132849.log b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-132849.log new file mode 100644 index 0000000..b32f25a --- /dev/null +++ b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-132849.log @@ -0,0 +1,377 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 3 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 3.96 sec and exited with 0 +// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" --output "/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 17.72 sec and exited with 0 +// ***** Done, took 00:00:21 (21.88 sec) ***** +// Found 3 benchmarks: +// DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=10] +// DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=1000] +// DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=100000] + +// ************************** +// Benchmark: DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=10] +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet DbfSharp.Benchmark-DefaultJob-1.dll --anonymousPipes 119 120 --benchmarkName "DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords(RowCount: 10)" --job Default --benchmarkId 0 in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.2 +// Runtime=.NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256 +// Job: DefaultJob + +OverheadJitting 1: 1 op, 240509.00 ns, 240.5090 us/op +WorkloadJitting 1: 1 op, 35248766.00 ns, 35.2488 ms/op + +WorkloadPilot 1: 2 op, 578844.00 ns, 289.4220 us/op +WorkloadPilot 2: 3 op, 729243.00 ns, 243.0810 us/op +WorkloadPilot 3: 4 op, 819585.00 ns, 204.8963 us/op +WorkloadPilot 4: 5 op, 923165.00 ns, 184.6330 us/op +WorkloadPilot 5: 6 op, 1013175.00 ns, 168.8625 us/op +WorkloadPilot 6: 7 op, 1244224.00 ns, 177.7463 us/op +WorkloadPilot 7: 8 op, 1279357.00 ns, 159.9196 us/op +WorkloadPilot 8: 9 op, 1373541.00 ns, 152.6157 us/op +WorkloadPilot 9: 10 op, 1546570.00 ns, 154.6570 us/op +WorkloadPilot 10: 11 op, 1752455.00 ns, 159.3141 us/op +WorkloadPilot 11: 12 op, 1820308.00 ns, 151.6923 us/op +WorkloadPilot 12: 13 op, 2074983.00 ns, 159.6141 us/op +WorkloadPilot 13: 14 op, 2203988.00 ns, 157.4277 us/op +WorkloadPilot 14: 15 op, 2405821.00 ns, 160.3881 us/op +WorkloadPilot 15: 16 op, 2417523.00 ns, 151.0952 us/op +WorkloadPilot 16: 32 op, 5217575.00 ns, 163.0492 us/op +WorkloadPilot 17: 64 op, 10724282.00 ns, 167.5669 us/op +WorkloadPilot 18: 128 op, 21147007.00 ns, 165.2110 us/op +WorkloadPilot 19: 256 op, 40869347.00 ns, 159.6459 us/op +WorkloadPilot 20: 512 op, 93704657.00 ns, 183.0169 us/op +WorkloadPilot 21: 1024 op, 204083095.00 ns, 199.2999 us/op +WorkloadPilot 22: 2048 op, 429284063.00 ns, 209.6114 us/op +WorkloadPilot 23: 4096 op, 312049151.00 ns, 76.1839 us/op +WorkloadPilot 24: 8192 op, 378024449.00 ns, 46.1456 us/op +WorkloadPilot 25: 16384 op, 721632265.00 ns, 44.0449 us/op + +OverheadWarmup 1: 16384 op, 76518.00 ns, 4.6703 ns/op +OverheadWarmup 2: 16384 op, 67511.00 ns, 4.1205 ns/op +OverheadWarmup 3: 16384 op, 67206.00 ns, 4.1019 ns/op +OverheadWarmup 4: 16384 op, 67273.00 ns, 4.1060 ns/op +OverheadWarmup 5: 16384 op, 68630.00 ns, 4.1888 ns/op +OverheadWarmup 6: 16384 op, 67340.00 ns, 4.1101 ns/op +OverheadWarmup 7: 16384 op, 67428.00 ns, 4.1155 ns/op +OverheadWarmup 8: 16384 op, 67388.00 ns, 4.1130 ns/op + +// BeforeActualRun +WorkloadActual 1: 16384 op, 729771303.00 ns, 44.5417 us/op +WorkloadActual 2: 16384 op, 745001280.00 ns, 45.4713 us/op +WorkloadActual 3: 16384 op, 720447280.00 ns, 43.9726 us/op +WorkloadActual 4: 16384 op, 726904200.00 ns, 44.3667 us/op +WorkloadActual 5: 16384 op, 739817394.00 ns, 45.1549 us/op +WorkloadActual 6: 16384 op, 708184641.00 ns, 43.2242 us/op +WorkloadActual 7: 16384 op, 704778334.00 ns, 43.0163 us/op +WorkloadActual 8: 16384 op, 713682382.00 ns, 43.5597 us/op +WorkloadActual 9: 16384 op, 702410114.00 ns, 42.8717 us/op +WorkloadActual 10: 16384 op, 706847867.00 ns, 43.1426 us/op +WorkloadActual 11: 16384 op, 701504927.00 ns, 42.8165 us/op +WorkloadActual 12: 16384 op, 712503839.00 ns, 43.4878 us/op +WorkloadActual 13: 16384 op, 717882326.00 ns, 43.8161 us/op +WorkloadActual 14: 16384 op, 720961938.00 ns, 44.0040 us/op +WorkloadActual 15: 16384 op, 805639308.00 ns, 49.1723 us/op +WorkloadActual 16: 16384 op, 826068013.00 ns, 50.4192 us/op +WorkloadActual 17: 16384 op, 765864283.00 ns, 46.7446 us/op +WorkloadActual 18: 16384 op, 703650533.00 ns, 42.9474 us/op +WorkloadActual 19: 16384 op, 704180120.00 ns, 42.9797 us/op +WorkloadActual 20: 16384 op, 704032685.00 ns, 42.9707 us/op +WorkloadActual 21: 16384 op, 711755954.00 ns, 43.4421 us/op +WorkloadActual 22: 16384 op, 711541672.00 ns, 43.4291 us/op +WorkloadActual 23: 16384 op, 704860038.00 ns, 43.0212 us/op + +// AfterActualRun +WorkloadResult 1: 16384 op, 729771303.00 ns, 44.5417 us/op +WorkloadResult 2: 16384 op, 745001280.00 ns, 45.4713 us/op +WorkloadResult 3: 16384 op, 720447280.00 ns, 43.9726 us/op +WorkloadResult 4: 16384 op, 726904200.00 ns, 44.3667 us/op +WorkloadResult 5: 16384 op, 739817394.00 ns, 45.1549 us/op +WorkloadResult 6: 16384 op, 708184641.00 ns, 43.2242 us/op +WorkloadResult 7: 16384 op, 704778334.00 ns, 43.0163 us/op +WorkloadResult 8: 16384 op, 713682382.00 ns, 43.5597 us/op +WorkloadResult 9: 16384 op, 702410114.00 ns, 42.8717 us/op +WorkloadResult 10: 16384 op, 706847867.00 ns, 43.1426 us/op +WorkloadResult 11: 16384 op, 701504927.00 ns, 42.8165 us/op +WorkloadResult 12: 16384 op, 712503839.00 ns, 43.4878 us/op +WorkloadResult 13: 16384 op, 717882326.00 ns, 43.8161 us/op +WorkloadResult 14: 16384 op, 720961938.00 ns, 44.0040 us/op +WorkloadResult 15: 16384 op, 703650533.00 ns, 42.9474 us/op +WorkloadResult 16: 16384 op, 704180120.00 ns, 42.9797 us/op +WorkloadResult 17: 16384 op, 704032685.00 ns, 42.9707 us/op +WorkloadResult 18: 16384 op, 711755954.00 ns, 43.4421 us/op +WorkloadResult 19: 16384 op, 711541672.00 ns, 43.4291 us/op +WorkloadResult 20: 16384 op, 704860038.00 ns, 43.0212 us/op +// GC: 56 13 0 1329250400 16384 +// Threading: 0 0 16384 + +// AfterAll +// Benchmark Process 8594 has exited with code 0. + +Mean = 43.612 μs, StdErr = 0.172 μs (0.39%), N = 20, StdDev = 0.767 μs +Min = 42.816 μs, Q1 = 43.007 μs, Median = 43.436 μs, Q3 = 43.980 μs, Max = 45.471 μs +IQR = 0.973 μs, LowerFence = 41.547 μs, UpperFence = 45.440 μs +ConfidenceInterval = [42.946 μs; 44.278 μs] (CI 99.9%), Margin = 0.666 μs (1.53% of Mean) +Skewness = 1.01, Kurtosis = 2.93, MValue = 2 + +// ** Remained 2 (66.7 %) benchmark(s) to run. Estimated finish 2025-08-08 13:30 (0h 0m from now) ** +// ************************** +// Benchmark: DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=1000] +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet DbfSharp.Benchmark-DefaultJob-1.dll --anonymousPipes 119 120 --benchmarkName "DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords(RowCount: 1000)" --job Default --benchmarkId 1 in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.2 +// Runtime=.NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256 +// Job: DefaultJob + +OverheadJitting 1: 1 op, 234932.00 ns, 234.9320 us/op +WorkloadJitting 1: 1 op, 46395292.00 ns, 46.3953 ms/op + +WorkloadPilot 1: 2 op, 22698454.00 ns, 11.3492 ms/op +WorkloadPilot 2: 3 op, 31960387.00 ns, 10.6535 ms/op +WorkloadPilot 3: 4 op, 42113446.00 ns, 10.5284 ms/op +WorkloadPilot 4: 5 op, 50432552.00 ns, 10.0865 ms/op +WorkloadPilot 5: 6 op, 59988641.00 ns, 9.9981 ms/op +WorkloadPilot 6: 7 op, 95080491.00 ns, 13.5829 ms/op +WorkloadPilot 7: 8 op, 122922476.00 ns, 15.3653 ms/op +WorkloadPilot 8: 9 op, 132728674.00 ns, 14.7476 ms/op +WorkloadPilot 9: 10 op, 87289420.00 ns, 8.7289 ms/op +WorkloadPilot 10: 11 op, 75269533.00 ns, 6.8427 ms/op +WorkloadPilot 11: 12 op, 75138138.00 ns, 6.2615 ms/op +WorkloadPilot 12: 13 op, 73591998.00 ns, 5.6609 ms/op +WorkloadPilot 13: 14 op, 57949596.00 ns, 4.1393 ms/op +WorkloadPilot 14: 15 op, 61341763.00 ns, 4.0895 ms/op +WorkloadPilot 15: 16 op, 64877987.00 ns, 4.0549 ms/op +WorkloadPilot 16: 32 op, 104816923.00 ns, 3.2755 ms/op +WorkloadPilot 17: 64 op, 166940383.00 ns, 2.6084 ms/op +WorkloadPilot 18: 128 op, 293482144.00 ns, 2.2928 ms/op +WorkloadPilot 19: 256 op, 577367497.00 ns, 2.2553 ms/op + +OverheadWarmup 1: 256 op, 4056.00 ns, 15.8438 ns/op +OverheadWarmup 2: 256 op, 1596.00 ns, 6.2344 ns/op +OverheadWarmup 3: 256 op, 1504.00 ns, 5.8750 ns/op +OverheadWarmup 4: 256 op, 1440.00 ns, 5.6250 ns/op +OverheadWarmup 5: 256 op, 1472.00 ns, 5.7500 ns/op +OverheadWarmup 6: 256 op, 1502.00 ns, 5.8672 ns/op +OverheadWarmup 7: 256 op, 1529.00 ns, 5.9727 ns/op +OverheadWarmup 8: 256 op, 1329.00 ns, 5.1914 ns/op +OverheadWarmup 9: 256 op, 1445.00 ns, 5.6445 ns/op +OverheadWarmup 10: 256 op, 1422.00 ns, 5.5547 ns/op + +// BeforeActualRun +WorkloadActual 1: 256 op, 584166663.00 ns, 2.2819 ms/op +WorkloadActual 2: 256 op, 581981955.00 ns, 2.2734 ms/op +WorkloadActual 3: 256 op, 579783500.00 ns, 2.2648 ms/op +WorkloadActual 4: 256 op, 575124918.00 ns, 2.2466 ms/op +WorkloadActual 5: 256 op, 573575662.00 ns, 2.2405 ms/op +WorkloadActual 6: 256 op, 578847949.00 ns, 2.2611 ms/op +WorkloadActual 7: 256 op, 589271371.00 ns, 2.3018 ms/op +WorkloadActual 8: 256 op, 577739624.00 ns, 2.2568 ms/op +WorkloadActual 9: 256 op, 577178144.00 ns, 2.2546 ms/op +WorkloadActual 10: 256 op, 576734573.00 ns, 2.2529 ms/op +WorkloadActual 11: 256 op, 578882649.00 ns, 2.2613 ms/op +WorkloadActual 12: 256 op, 579810568.00 ns, 2.2649 ms/op +WorkloadActual 13: 256 op, 577866361.00 ns, 2.2573 ms/op +WorkloadActual 14: 256 op, 577323559.00 ns, 2.2552 ms/op +WorkloadActual 15: 256 op, 576819483.00 ns, 2.2532 ms/op + +// AfterActualRun +WorkloadResult 1: 256 op, 581981955.00 ns, 2.2734 ms/op +WorkloadResult 2: 256 op, 579783500.00 ns, 2.2648 ms/op +WorkloadResult 3: 256 op, 575124918.00 ns, 2.2466 ms/op +WorkloadResult 4: 256 op, 573575662.00 ns, 2.2405 ms/op +WorkloadResult 5: 256 op, 578847949.00 ns, 2.2611 ms/op +WorkloadResult 6: 256 op, 577739624.00 ns, 2.2568 ms/op +WorkloadResult 7: 256 op, 577178144.00 ns, 2.2546 ms/op +WorkloadResult 8: 256 op, 576734573.00 ns, 2.2529 ms/op +WorkloadResult 9: 256 op, 578882649.00 ns, 2.2613 ms/op +WorkloadResult 10: 256 op, 579810568.00 ns, 2.2649 ms/op +WorkloadResult 11: 256 op, 577866361.00 ns, 2.2573 ms/op +WorkloadResult 12: 256 op, 577323559.00 ns, 2.2552 ms/op +WorkloadResult 13: 256 op, 576819483.00 ns, 2.2532 ms/op +// GC: 8 1 0 208815712 256 +// Threading: 0 0 256 + +// AfterAll +// Benchmark Process 8607 has exited with code 0. + +Mean = 2.257 ms, StdErr = 0.002 ms (0.10%), N = 13, StdDev = 0.008 ms +Min = 2.241 ms, Q1 = 2.253 ms, Median = 2.257 ms, Q3 = 2.261 ms, Max = 2.273 ms +IQR = 0.008 ms, LowerFence = 2.241 ms, UpperFence = 2.273 ms +ConfidenceInterval = [2.247 ms; 2.267 ms] (CI 99.9%), Margin = 0.010 ms (0.45% of Mean) +Skewness = -0.07, Kurtosis = 2.57, MValue = 2 + +// ** Remained 1 (33.3 %) benchmark(s) to run. Estimated finish 2025-08-08 13:29 (0h 0m from now) ** +// ************************** +// Benchmark: DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=100000] +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet DbfSharp.Benchmark-DefaultJob-1.dll --anonymousPipes 119 120 --benchmarkName "DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords(RowCount: 100000)" --job Default --benchmarkId 2 in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.2 +// Runtime=.NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256 +// Job: DefaultJob + +OverheadJitting 1: 1 op, 264269.00 ns, 264.2690 us/op +WorkloadJitting 1: 1 op, 930882802.00 ns, 930.8828 ms/op + +OverheadJitting 2: 1 op, 1004.00 ns, 1.0040 us/op +WorkloadJitting 2: 1 op, 275398886.00 ns, 275.3989 ms/op + +WorkloadPilot 1: 2 op, 465181858.00 ns, 232.5909 ms/op +WorkloadPilot 2: 3 op, 684994860.00 ns, 228.3316 ms/op + +OverheadWarmup 1: 3 op, 1067.00 ns, 355.6667 ns/op +OverheadWarmup 2: 3 op, 572.00 ns, 190.6667 ns/op +OverheadWarmup 3: 3 op, 443.00 ns, 147.6667 ns/op +OverheadWarmup 4: 3 op, 588.00 ns, 196.0000 ns/op +OverheadWarmup 5: 3 op, 535.00 ns, 178.3333 ns/op +OverheadWarmup 6: 3 op, 555.00 ns, 185.0000 ns/op +OverheadWarmup 7: 3 op, 634.00 ns, 211.3333 ns/op +OverheadWarmup 8: 3 op, 387.00 ns, 129.0000 ns/op + +// BeforeActualRun +WorkloadActual 1: 3 op, 684651345.00 ns, 228.2171 ms/op +WorkloadActual 2: 3 op, 692503348.00 ns, 230.8344 ms/op +WorkloadActual 3: 3 op, 696654120.00 ns, 232.2180 ms/op +WorkloadActual 4: 3 op, 690593852.00 ns, 230.1980 ms/op +WorkloadActual 5: 3 op, 676887126.00 ns, 225.6290 ms/op +WorkloadActual 6: 3 op, 677494459.00 ns, 225.8315 ms/op +WorkloadActual 7: 3 op, 679480145.00 ns, 226.4934 ms/op +WorkloadActual 8: 3 op, 679961506.00 ns, 226.6538 ms/op +WorkloadActual 9: 3 op, 679763220.00 ns, 226.5877 ms/op +WorkloadActual 10: 3 op, 677680060.00 ns, 225.8934 ms/op +WorkloadActual 11: 3 op, 677829865.00 ns, 225.9433 ms/op +WorkloadActual 12: 3 op, 679330110.00 ns, 226.4434 ms/op +WorkloadActual 13: 3 op, 678314955.00 ns, 226.1050 ms/op +WorkloadActual 14: 3 op, 675080797.00 ns, 225.0269 ms/op +WorkloadActual 15: 3 op, 676233143.00 ns, 225.4110 ms/op + +// AfterActualRun +WorkloadResult 1: 3 op, 684651345.00 ns, 228.2171 ms/op +WorkloadResult 2: 3 op, 676887126.00 ns, 225.6290 ms/op +WorkloadResult 3: 3 op, 677494459.00 ns, 225.8315 ms/op +WorkloadResult 4: 3 op, 679480145.00 ns, 226.4934 ms/op +WorkloadResult 5: 3 op, 679961506.00 ns, 226.6538 ms/op +WorkloadResult 6: 3 op, 679763220.00 ns, 226.5877 ms/op +WorkloadResult 7: 3 op, 677680060.00 ns, 225.8934 ms/op +WorkloadResult 8: 3 op, 677829865.00 ns, 225.9433 ms/op +WorkloadResult 9: 3 op, 679330110.00 ns, 226.4434 ms/op +WorkloadResult 10: 3 op, 678314955.00 ns, 226.1050 ms/op +WorkloadResult 11: 3 op, 675080797.00 ns, 225.0269 ms/op +WorkloadResult 12: 3 op, 676233143.00 ns, 225.4110 ms/op +// GC: 8 0 0 211324080 3 +// Threading: 0 0 3 + +// AfterAll +// Benchmark Process 8621 has exited with code 0. + +Mean = 226.186 ms, StdErr = 0.234 ms (0.10%), N = 12, StdDev = 0.809 ms +Min = 225.027 ms, Q1 = 225.781 ms, Median = 226.024 ms, Q3 = 226.517 ms, Max = 228.217 ms +IQR = 0.736 ms, LowerFence = 224.677 ms, UpperFence = 227.621 ms +ConfidenceInterval = [225.150 ms; 227.222 ms] (CI 99.9%), Margin = 1.036 ms (0.46% of Mean) +Skewness = 0.99, Kurtosis = 3.77, MValue = 2 + +// ** Remained 0 (0.0 %) benchmark(s) to run. Estimated finish 2025-08-08 13:29 (0h 0m from now) ** +// ***** BenchmarkRunner: Finish ***** + +// * Export * + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.csv + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report-github.md + BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.html + +// * Detailed results * +DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=10] +Runtime = .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2; GC = Concurrent Workstation +Mean = 43.612 μs, StdErr = 0.172 μs (0.39%), N = 20, StdDev = 0.767 μs +Min = 42.816 μs, Q1 = 43.007 μs, Median = 43.436 μs, Q3 = 43.980 μs, Max = 45.471 μs +IQR = 0.973 μs, LowerFence = 41.547 μs, UpperFence = 45.440 μs +ConfidenceInterval = [42.946 μs; 44.278 μs] (CI 99.9%), Margin = 0.666 μs (1.53% of Mean) +Skewness = 1.01, Kurtosis = 2.93, MValue = 2 +-------------------- Histogram -------------------- +[42.721 μs ; 43.737 μs) | @@@@@@@@@@@@@ +[43.737 μs ; 45.766 μs) | @@@@@@@ +--------------------------------------------------- + +DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=1000] +Runtime = .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2; GC = Concurrent Workstation +Mean = 2.257 ms, StdErr = 0.002 ms (0.10%), N = 13, StdDev = 0.008 ms +Min = 2.241 ms, Q1 = 2.253 ms, Median = 2.257 ms, Q3 = 2.261 ms, Max = 2.273 ms +IQR = 0.008 ms, LowerFence = 2.241 ms, UpperFence = 2.273 ms +ConfidenceInterval = [2.247 ms; 2.267 ms] (CI 99.9%), Margin = 0.010 ms (0.45% of Mean) +Skewness = -0.07, Kurtosis = 2.57, MValue = 2 +-------------------- Histogram -------------------- +[2.236 ms ; 2.278 ms) | @@@@@@@@@@@@@ +--------------------------------------------------- + +DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=100000] +Runtime = .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2; GC = Concurrent Workstation +Mean = 226.186 ms, StdErr = 0.234 ms (0.10%), N = 12, StdDev = 0.809 ms +Min = 225.027 ms, Q1 = 225.781 ms, Median = 226.024 ms, Q3 = 226.517 ms, Max = 228.217 ms +IQR = 0.736 ms, LowerFence = 224.677 ms, UpperFence = 227.621 ms +ConfidenceInterval = [225.150 ms; 227.222 ms] (CI 99.9%), Margin = 1.036 ms (0.46% of Mean) +Skewness = 0.99, Kurtosis = 3.77, MValue = 2 +-------------------- Histogram -------------------- +[224.563 ms ; 228.681 ms) | @@@@@@@@@@@@ +--------------------------------------------------- + +// * Summary * + +BenchmarkDotNet v0.15.2, Linux Ubuntu 24.04.2 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 9.0.109 + [Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + DefaultJob : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + + +| Method | RowCount | Mean | Error | StdDev | Gen0 | Gen1 | Allocated | +|--------------------------------------------- |--------- |--------------:|-------------:|-----------:|----------:|-------:|------------:| +| 'Read all records from a generated DBF file' | 10 | 43.61 μs | 0.666 μs | 0.767 μs | 3.4180 | 0.7935 | 79.23 KB | +| 'Read all records from a generated DBF file' | 1000 | 2,257.11 μs | 10.056 μs | 8.397 μs | 31.2500 | 3.9063 | 796.57 KB | +| 'Read all records from a generated DBF file' | 100000 | 226,186.30 μs | 1,036.068 μs | 808.894 μs | 2666.6667 | - | 68790.39 KB | + +// * Hints * +Outliers + DbfReaderBenchmarks.'Read all records from a generated DBF file': Default -> 3 outliers were removed (46.74 μs..50.42 μs) + DbfReaderBenchmarks.'Read all records from a generated DBF file': Default -> 2 outliers were removed (2.28 ms, 2.30 ms) + DbfReaderBenchmarks.'Read all records from a generated DBF file': Default -> 3 outliers were removed (230.20 ms..232.22 ms) + +// * Legends * + RowCount : Value of the 'RowCount' parameter + 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 + Gen1 : GC Generation 1 collects per 1000 operations + Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B) + 1 μs : 1 Microsecond (0.000001 sec) + +// * Diagnostic Output - MemoryDiagnoser * + + +// ***** BenchmarkRunner: End ***** +Run time: 00:00:46 (46.34 sec), executed benchmarks: 3 + +Global total time: 00:01:08 (68.41 sec), executed benchmarks: 3 +// * Artifacts cleanup * +Artifacts cleanup is finished diff --git a/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-133030.log b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-133030.log new file mode 100644 index 0000000..5c3b5cc --- /dev/null +++ b/BenchmarkDotNet.Artifacts/DbfSharp.Benchmark.DbfReaderBenchmarks-20250808-133030.log @@ -0,0 +1,136 @@ +// Validating benchmarks: +// ***** BenchmarkRunner: Start ***** +// ***** Found 3 benchmark(s) in total ***** +// ***** Building 1 exe(s) in Parallel: Start ***** +// start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 2.76 sec and exited with 0 +// start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true /p:ArtifactsPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/" /p:OutDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:OutputPath="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" /p:PublishDir="/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/publish/" --output "/app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0/" in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1 +// command took 14.55 sec and exited with 0 +// ***** Done, took 00:00:17 (17.4 sec) ***** +// Found 3 benchmarks: +// DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=100000] +// DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=1000000] +// DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=10000000] + +// ************************** +// Benchmark: DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=100000] +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet DbfSharp.Benchmark-DefaultJob-1.dll --anonymousPipes 119 120 --benchmarkName "DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords(RowCount: 100000)" --job Default --benchmarkId 0 in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.2 +// Runtime=.NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256 +// Job: DefaultJob + +OverheadJitting 1: 1 op, 255574.00 ns, 255.5740 us/op +WorkloadJitting 1: 1 op, 897715260.00 ns, 897.7153 ms/op + +OverheadJitting 2: 1 op, 751.00 ns, 751.0000 ns/op +WorkloadJitting 2: 1 op, 246088809.00 ns, 246.0888 ms/op + +WorkloadPilot 1: 2 op, 484643939.00 ns, 242.3220 ms/op +WorkloadPilot 2: 3 op, 708920438.00 ns, 236.3068 ms/op + +OverheadWarmup 1: 3 op, 979.00 ns, 326.3333 ns/op +OverheadWarmup 2: 3 op, 581.00 ns, 193.6667 ns/op +OverheadWarmup 3: 3 op, 571.00 ns, 190.3333 ns/op +OverheadWarmup 4: 3 op, 579.00 ns, 193.0000 ns/op +OverheadWarmup 5: 3 op, 588.00 ns, 196.0000 ns/op +OverheadWarmup 6: 3 op, 555.00 ns, 185.0000 ns/op +OverheadWarmup 7: 3 op, 533.00 ns, 177.6667 ns/op +OverheadWarmup 8: 3 op, 545.00 ns, 181.6667 ns/op +OverheadWarmup 9: 3 op, 533.00 ns, 177.6667 ns/op + +// BeforeActualRun +WorkloadActual 1: 3 op, 706495304.00 ns, 235.4984 ms/op +WorkloadActual 2: 3 op, 711560060.00 ns, 237.1867 ms/op +WorkloadActual 3: 3 op, 712587847.00 ns, 237.5293 ms/op +WorkloadActual 4: 3 op, 713307578.00 ns, 237.7692 ms/op +WorkloadActual 5: 3 op, 706816319.00 ns, 235.6054 ms/op +WorkloadActual 6: 3 op, 704403979.00 ns, 234.8013 ms/op +WorkloadActual 7: 3 op, 702920500.00 ns, 234.3068 ms/op +WorkloadActual 8: 3 op, 710442254.00 ns, 236.8141 ms/op +WorkloadActual 9: 3 op, 710405132.00 ns, 236.8017 ms/op +WorkloadActual 10: 3 op, 706125897.00 ns, 235.3753 ms/op +WorkloadActual 11: 3 op, 703998599.00 ns, 234.6662 ms/op +WorkloadActual 12: 3 op, 724333672.00 ns, 241.4446 ms/op +WorkloadActual 13: 3 op, 709732762.00 ns, 236.5776 ms/op +WorkloadActual 14: 3 op, 703449850.00 ns, 234.4833 ms/op +WorkloadActual 15: 3 op, 704123827.00 ns, 234.7079 ms/op + +// AfterActualRun +WorkloadResult 1: 3 op, 706495304.00 ns, 235.4984 ms/op +WorkloadResult 2: 3 op, 711560060.00 ns, 237.1867 ms/op +WorkloadResult 3: 3 op, 712587847.00 ns, 237.5293 ms/op +WorkloadResult 4: 3 op, 713307578.00 ns, 237.7692 ms/op +WorkloadResult 5: 3 op, 706816319.00 ns, 235.6054 ms/op +WorkloadResult 6: 3 op, 704403979.00 ns, 234.8013 ms/op +WorkloadResult 7: 3 op, 702920500.00 ns, 234.3068 ms/op +WorkloadResult 8: 3 op, 710442254.00 ns, 236.8141 ms/op +WorkloadResult 9: 3 op, 710405132.00 ns, 236.8017 ms/op +WorkloadResult 10: 3 op, 706125897.00 ns, 235.3753 ms/op +WorkloadResult 11: 3 op, 703998599.00 ns, 234.6662 ms/op +WorkloadResult 12: 3 op, 709732762.00 ns, 236.5776 ms/op +WorkloadResult 13: 3 op, 703449850.00 ns, 234.4833 ms/op +WorkloadResult 14: 3 op, 704123827.00 ns, 234.7079 ms/op +// GC: 8 0 0 211324080 3 +// Threading: 0 0 3 + +// AfterAll +// Benchmark Process 9074 has exited with code 0. + +Mean = 235.866 ms, StdErr = 0.324 ms (0.14%), N = 14, StdDev = 1.213 ms +Min = 234.307 ms, Q1 = 234.731 ms, Median = 235.552 ms, Q3 = 236.811 ms, Max = 237.769 ms +IQR = 2.080 ms, LowerFence = 231.612 ms, UpperFence = 239.931 ms +ConfidenceInterval = [234.498 ms; 237.234 ms] (CI 99.9%), Margin = 1.368 ms (0.58% of Mean) +Skewness = 0.19, Kurtosis = 1.34, MValue = 2 + +// ** Remained 2 (66.7 %) benchmark(s) to run. Estimated finish 2025-08-08 13:31 (0h 0m from now) ** +// ************************** +// Benchmark: DbfReaderBenchmarks.'Read all records from a generated DBF file': DefaultJob [RowCount=1000000] +// *** Execute *** +// Launch: 1 / 1 +// Execute: dotnet DbfSharp.Benchmark-DefaultJob-1.dll --anonymousPipes 119 120 --benchmarkName "DbfSharp.Benchmark.DbfReaderBenchmarks.ReadAllRecords(RowCount: 1000000)" --job Default --benchmarkId 1 in /app/DbfSharp.Benchmark/bin/Release/net9.0/DbfSharp.Benchmark-DefaultJob-1/bin/Release/net9.0 +// Failed to set up high priority (Permission denied). In order to run benchmarks with high priority, make sure you have the right permissions. +// BeforeAnythingElse + +// Benchmark Process Environment Information: +// BenchmarkDotNet v0.15.2 +// Runtime=.NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 +// GC=Concurrent Workstation +// HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256 +// Job: DefaultJob + +OverheadJitting 1: 1 op, 291712.00 ns, 291.7120 us/op +WorkloadJitting 1: 1 op, 3001795114.00 ns, 3.0018 s/op + +OverheadJitting 2: 1 op, 984.00 ns, 984.0000 ns/op +WorkloadJitting 2: 1 op, 2408120287.00 ns, 2.4081 s/op + +OverheadWarmup 1: 1 op, 1054.00 ns, 1.0540 us/op +OverheadWarmup 2: 1 op, 594.00 ns, 594.0000 ns/op +OverheadWarmup 3: 1 op, 464.00 ns, 464.0000 ns/op +OverheadWarmup 4: 1 op, 517.00 ns, 517.0000 ns/op +OverheadWarmup 5: 1 op, 490.00 ns, 490.0000 ns/op +OverheadWarmup 6: 1 op, 533.00 ns, 533.0000 ns/op +OverheadWarmup 7: 1 op, 734.00 ns, 734.0000 ns/op +OverheadWarmup 8: 1 op, 689.00 ns, 689.0000 ns/op + +// BeforeActualRun +WorkloadActual 1: 1 op, 2277004383.00 ns, 2.2770 s/op +WorkloadActual 2: 1 op, 2284348599.00 ns, 2.2843 s/op +WorkloadActual 3: 1 op, 2306145377.00 ns, 2.3061 s/op +WorkloadActual 4: 1 op, 2276236872.00 ns, 2.2762 s/op +WorkloadActual 5: 1 op, 2278872221.00 ns, 2.2789 s/op +WorkloadActual 6: 1 op, 2265595653.00 ns, 2.2656 s/op +WorkloadActual 7: 1 op, 2280190383.00 ns, 2.2802 s/op +WorkloadActual 8: 1 op, 2278568008.00 ns, 2.2786 s/op +WorkloadActual 9: 1 op, 2271916430.00 ns, 2.2719 s/op +WorkloadActual 10: 1 op, 2266336141.00 ns, 2.2663 s/op +WorkloadActual 11: 1 op, 2285271097.00 ns, 2.2853 s/op +WorkloadActual 12: 1 op, 2310206 \ No newline at end of file diff --git a/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report-github.md b/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report-github.md new file mode 100644 index 0000000..476a874 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report-github.md @@ -0,0 +1,15 @@ +``` + +BenchmarkDotNet v0.15.2, Linux Ubuntu 24.04.2 LTS (Noble Numbat) +Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores +.NET SDK 9.0.109 + [Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + DefaultJob : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2 + + +``` +| Method | RowCount | Mean | Error | StdDev | Median | Gen0 | Gen1 | Allocated | +|--------------------------------------------- |--------- |------------:|----------:|----------:|------------:|------------:|----------:|-----------:| +| **'Read all records from a generated DBF file'** | **100000** | **235.9 ms** | **1.37 ms** | **1.21 ms** | **235.6 ms** | **2666.6667** | **-** | **67.18 MB** | +| **'Read all records from a generated DBF file'** | **1000000** | **2,281.9 ms** | **15.83 ms** | **13.22 ms** | **2,278.9 ms** | **31000.0000** | **-** | **698.9 MB** | +| **'Read all records from a generated DBF file'** | **10000000** | **23,486.2 ms** | **467.46 ms** | **986.03 ms** | **22,963.4 ms** | **312000.0000** | **2000.0000** | **7016.15 MB** | diff --git a/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.csv b/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.csv new file mode 100644 index 0000000..dc5f834 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.csv @@ -0,0 +1,4 @@ +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,RowCount,Mean,Error,StdDev,Median,Gen0,Gen1,Allocated +'Read all records from a generated DBF file',DefaultJob,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,100000,235.9 ms,1.37 ms,1.21 ms,235.6 ms,2666.6667,0.0000,67.18 MB +'Read all records from a generated DBF file',DefaultJob,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,1000000,"2,281.9 ms",15.83 ms,13.22 ms,"2,278.9 ms",31000.0000,0.0000,698.9 MB +'Read all records from a generated DBF file',DefaultJob,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,10000000,"23,486.2 ms",467.46 ms,986.03 ms,"22,963.4 ms",312000.0000,2000.0000,7016.15 MB diff --git a/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.html b/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.html new file mode 100644 index 0000000..3e1f095 --- /dev/null +++ b/BenchmarkDotNet.Artifacts/results/DbfSharp.Benchmark.DbfReaderBenchmarks-report.html @@ -0,0 +1,32 @@ + + +
+ +
+BenchmarkDotNet v0.15.2, Linux Ubuntu 24.04.2 LTS (Noble Numbat)
+Intel Xeon Processor 2.30GHz, 1 CPU, 4 logical and 4 physical cores
+.NET SDK 9.0.109
+ [Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2
+ DefaultJob : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2
+
+
+
+| Method | RowCount | Mean | Error | StdDev | Median | Gen0 | Gen1 | Allocated | +
|---|---|---|---|---|---|---|---|---|
| 'Read all records from a generated DBF file' | 100000 | 235.9 ms | 1.37 ms | 1.21 ms | 235.6 ms | 2666.6667 | - | 67.18 MB | +
| 'Read all records from a generated DBF file' | 1000000 | 2,281.9 ms | 15.83 ms | 13.22 ms | 2,278.9 ms | 31000.0000 | - | 698.9 MB | +
| 'Read all records from a generated DBF file' | 10000000 | 23,486.2 ms | 467.46 ms | 986.03 ms | 22,963.4 ms | 312000.0000 | 2000.0000 | 7016.15 MB | +
)Q!0l7)GWeeR z&T70Txmh9`?3o}kRkrpIHoI0Wfo$-doYg4^ly(_TdEjo+GLa27m5#^}>{?GVs&qvR z3m7Z|XLSsL@tR~{A|Gq_6XPl(E0g3vuh})+B*=+H;N(XUC=IL}O>wW0Ok{&Crz5iH zwGfgTd^2aIA|QMxfTsz~!j@`VMSbG_ubIdO+weeSRoObQlO)Sm*`|H|X}E14gT;H8 ztd0;_87z$p4kog}_S6wsuh~UR{g5*BA7ganYK?RH+Urxcd5X7_X}(NXvyRG$R3!Ob z=PoJK9R*7}W{&zjtqZT&Tdw1JE?`Vao~5ETSddyZxzzLUo84w2n}XW5or=iHXFqVY z5}6q3B4y|&GD*lmEdmwwG?8ZzS(D4*R%t-3Kl)8$n8*g<))Cp8uj5_k9mGE}(X~E8 z!bnNONd{FqZ_G$a{zb%>oz!|CFH8(5F0hjkHW;gQ)6=thd=kjPDIUo*d!O z1U?qsLKEh86FkrzsAxKtZ);9z>C6_60~jW|cBwb{i_^Ev;f|$)5T!zx3 z9L!jEA7COknDi5QqWJ_i&)xGC6WL(v>4+T7i+Gu@$Xm{~*+uecf~C!_|FQ}5l@0-& zwKHA1`@6?PHrQr+BDY4qp_NSM@ir!>pA5eAkQEbo2&Sd&!XXLoE)5geV3X;HEVLFv z&OXN2TUs)-Cc#Hr?D7IDvNeYGRI`P>P~K$(6WL(1RYX?i$f2#ZqB-1b=Fs91=8_;2 zd5>dhgmfsRca@HbY_Pd>M0V!!Y6~6B_G`#8bv)a_QcuxNqYJ_Ag zu)t8k-!z*eMAne|O^bH5mobqILaQUPhgIumh|BixTywZWny?g>Mj-^>idDXw@VYgC zmab+oM^ gbukj`k9$Zv< zwnq6wXAyiHI53e7wxc9+schZk8HP!$vDZaTNffZ0M@}p^S*Ta#3Xae@Ls3&b`t=ba zYt%N!fff_lU_0uF9L=*$mK1sWHD?>BZ)c-~*g(AkM(?H0w102nyNX~U8*HwM$jTf! z(%bAZ_)^a51O!S)9Veu}pQKD=gKecFvfdjb@iZ~G3_{55C&A~Dk0J)gcCN5n4(AW) zbv` f2s&y}s zmBG^MXx~!`CbGfS(h=F2W20#Wds(d?(Y1cc3(4iz*R6$++fTanSauoH01SnYP`{6? zbGFkwch6T$WP`0&5n1`{N3PVhp5gRUqS6# ^i;EJ>C;KB75^${8VHhmii+$yVNLL_nZ2$rGsDF*Qhm2V@UKyTbl&Q3rG-d=HkU} z^|kt`AxZ8kD0~rO*rGZ8q_cK*S5@mREKB5GXikriM8^N|tDlYhWSc`-qixo@j@Dls zBQn;xY@G+AlbEZ2?P%^EA+qKZIF4#Fkqx#Z7~CPUwAmF?10j>+#`pS*By5Zgg{?XL z)c*{}GzjR-7B;c>e8ogI*m^aQn@Mscy)h;jNwYUbgFv61Rm7TIXJhw359)|4ZFY4} zKM^aMgE11e+())w-$x#t;}{d-^pkJd8Y`MDD@^06IZI@N?O74I*+@pu(OL*0h6M&{ zT1yVgePsLfePn~Ry1%S?i9C_kgva?~A{%U19g&6BLdd!1aQh1@b*)$VOMEzyJl#EE zV>;dN0c903ts!AG!Tnw{kqx$8P2_rxjGmLo&7G?o(KJ|#5ocAJ1s`Yqn8*g(RY&AO zHoFXzfoOmj$nk!&!1j|5|H$15h}PQK{nk@0ITKk$ !!(DkJn9t*-T8YkO5j zul`*u@*-V5y0xx7Oh<^!nq9B @z-vcZ=gvSK0+z_hd`JRsd2CSf8QY&0E_BdxCWx#n>D z3rkk5N$|0bG4`XxZdH$9!%-CiHIbWrWML)icsIagK$Qpoy($9re!^AX@(!7^L^cSz zj>vj%jKr?B!7^}G&|&p$*RnMRk+c@U$AK6V* }h=F=F>db30DJH?knj?eAzU68RB8}Lz zKNI;(;^-c$iClm8(Q~w?p9Z^@(7i@`k1&@6naCw*T34%DIPdNz6WL&s>4@yjpW =dDFRet(7duC1EZJJ{FM)G)+)z5xj}M=PM?%!PYwvS=F@`zSj4X!IvJgBFr`a zf-&S++V>wrMY?rhB6l%4`;LytdT)%xK>gWoY#t;;Cc(#&$ijDhE7EwH(3 u=kx@glgI!A)EZyT|b%e-lv+HrX!TB}S5jmQJ$Q@hs#M8w2udJVB zPZKp1*hhAJYy@^mtM$>*Ja^AmERhYiUPWX@*V@+G>>BJN#$f3lC#!xUOOHF_{4tRY zwyTcFLc5QAzRMWt`^nKL8j?vd2|m^wxwlER&USiJ-&F(?* tFJxiF6#eVmDGuwisW_U7xfpaw!F=X#pxFD#i9_a}Vh7_E #mvfdjbaT#Nv3{2z(L~K9VmSgGmk-N68 zo5$|@iivEn`5Gcu%hqtyq}A*i?Cfc9>6pk3R7Z&1C3o}KU0*Sg4K|;S$dS=~ QQ8 zSjFmDWC>IDk`}85uY4hI#FfLBpENO@D-7C&qc}bhQRrKq &xKA?u#gh~5^6#)`ud*%*|%j6l43yo{5UogXA5M4raW zwZgN0B6r^*BHOY;J0#4Nw?DI@&n#z>KWC@0ahfmJ+xThGQDf=8{WkB2$n~tiiaJDY zeFAT@?B|w>iF__{^f}vB JF`|v_v9TxA|`y0bcBC iXuZZN)R(&q z=Ira&*z(G$gIMfxZOgWK`>BDX|4O(_ @_Wlc-y2KO5}71k$nM? zT<$j|Sh-#-n%A6nwZvN&|9bI 2|Z?*63^ z0rRiomu6?_P@|V@5m%c{xHa8P=V`<9S|XoNf6{45@T7g@X}sFR3oNxOC2W<1WKM$Q zU1V>omC=;~AhKgcol%P1xEtA_38(|P!jk%Gyx4W6&a}@KB4Cc? DkEO9BvvHn zQ~vU;QjVI)>wKl~TS?JeVrcDJu2F@MWjg(|I&sUYDbNjE^-E-jRWxs)eeSRb!nOCO zpFV4ELJ^5fM%p!zw;716j&93IUQ4c^(?TIc1Vk*7Ad!*;$#)Q%qy%pi6dn()-w5iF zy+*i>)@6)QB6~QbVNyjiTRx}Q`tInJ-hbOTVYya#{}t)hfQQyyObp%;u3H~t{7jiF z8zpjJxq>e2Tq2Q|=>{4q22oJ6`k2S7&x#l;fQOSK*@UdwtEtbs7E$C{aIHGUO#fM3 z{c}QA2ssbZM}JDVp4N({Q6fXr+KLEsN${khHAt3i^S+g?J7`iUt-4kuLIT2M67Z_^ z9W>u97E!oTv#YBRVwA`@AYhv$@~f-Xw}`Y_CP-x6#|``MA TZnrhZHk zIgq;67Lh(Ac#=eJh^(%&4XyGGqyv%hannd-Csb5vZlItBi@ E5^k7et67mH z?KraiL|3hY!1ui%?CzD68V%4gX>!AnJqt(nOs-nT$ue7Im?y{E?ByQ03?jqSLT3RG z5;@WwY-zB(=PM@iRa;NE(L8}d2;uSM6(aYRNlRob> ZFy)}{J6S;4X!OM*o{p{i~k {!G&4)&tM>QNW-dHu{se=W>d7Zr zStjy3H8~Ucoq)gd*9y xj%!&<*Xrh5x=CX?GK6-Op>01h7e#P8v^pd zvJqaWmB^IHL#NF6Fi45)KNyVWs>?(+hvg&XB)mu~k=OD3pDLTay8^z@6^kK{1ku~p zm5Kbec#q|6!ncxa6F*@F+xihA69L^y+6v&qASJS9Hr`6c0X+i3=hIJmWccoJ1kiKl z(%i=PBpFV;7u41@Ny0(%2;jSFKGWOCku|%n+780Ep|PKB(pAzdZQ+fC$V5Q*7pW8} zBkqp A>$Een9x9PF*infLB0HAo7~j)8$+uu3#2FU~FlyxBGu}4z z1mVm-!w3jJl!qqhT9-j08!qs;vqP63YXx~|ZK`E$=}L?Kgdfe*Rnc*zG;nB5vqP9l zWK9yj)rWu+GLieR;rquB5P>z{yH#kXVj{Qkc(V|%TE7|8_xd8+(Ww84K+Ko%j4F1) zie_t>8YUhW2@Xje+%46s)-T!W>v*yG@iN}zFZ;v(QtS(*JBrW`Em+^1rVDkqI?iUh zc=?Cwj8(kYPNwm4tp}Glaa+f;-;ZjItFASsl=bx}F5tpXHhz1KJc^pVUnOiuvydVJ z*zD45KM^87<%Q~@ye9Jd)n=S;7J;UX#!*$CBVV;0(Q~x^k*Dz=aoj1c VE*KmvouB%F8xVWce#}fGzv`$Woo})d+xXM~at=C1CZu3F8E7Rja={b>t z0KThAXjGR>Zx mQjA zd9Z*kMaqb~<5e328}K0yt*;F6NV7-J(QZHCq+s!FQ)go4x{2T`qX^);YBawa%8VuQ zRU1QuB3b>RAg7ThIPTjbG7-@IMJh$gh`VEd&5gu}aAf<)4Ju6J28%0Pq36t(*_S(N zMROZ3 7aLgvdld_ZO)YDI@NV z{WUif!*gUqKt5PDB6PKjT}0QK9GW-=Quok=7r?N9O%6>g^VN3Q7`->+A6bO^cVRp2 zW4@YJ=d6#vi=4>VJJ3P>p`ZHW_$8aHWB7ht{r!ENm#`8XPxea&KYqz}usxcjljq`R z6A95VTpm4+C9 #|`G6NNkq3apNsb}FL_UVjDRH)=*`pMpUbBm2 z%tR)DaPU+Fn8>Fh)|cLPH7lYbjI>rX33H`) ew>0UCkaPjMXOFeAPKL!9;$S=66FrH1RIL-_uKNSEDr~B9SCHR=bFycXLFB z%=awU7TCCv+fASD39>gYD~!3n`8%)rLJ>LGe6%pm;Gy-Efwt${yvUxgX8mIr@5&Dw zrsjxzh2qCE*zesfQ0^;a{;pZNMs=;-TT=LBBAe=2wyW6`!WUC(SYRNLm+5xavJ%8| z R@uh4S#GdW16}% zksB;7yRtpa{7Xb03=70916}ep=7@}0IOL3+BX6MG7%!glm9)*-GOKuE#g>2Az%|Au zev- ?kT7?io z {3{BI{7$d*>s- zL_Qz8_LH`!-A9hJRy2t!*9?=mY*wp{)S6wG_)Zu3R((-9s@4pxOJ`5`J{&SRezZ`{ z5ZC0SA&DJPuv{w~QGJxEFp(87F1oZmjb9 d~o%U!l?y=PX$JLQJlC#eV4d}u;JhA#&qz(gJh)OpEl z%SonE3z|Gm7Q4ulxt=4Fr&uAR1ITGNe4WzHX<6KAY9{hkTL!us$#W5}rs-y?h};Qr zh`h{-ACz+R6Zx=(tXb?*9_PzG1fVI>7j^IVnaEddLEG{YX>RU0YaeAK5}EM2pU7oT zG^;Uu)%tVhZ-oF8`Kn0U7Q8XOuAloS8cQV%$$jQ)pmn&Z;wQVt?NZ? z?Rt|h6bCYmg^*496mPbfddQgWBSY8PvjX9E^oq}~*BWc+7(pbtx&U{6c5nY=udX#z z-`~D8*L)+4#W h kKIEGCh}EV$rjM;T7Fs(#jXh;TiWc}q-*jPLS!PK`-xmm@Eu!S;1lG;LSwY2v1d zYzh(1=M52HB3~73+xE0XCS&QrWxy)9OsiQRADjgz93=uw E^ylOp}{Njrbpa1&v$zT83KbrjF&nF_3 z=A-ymBVhYFn_YI8Jg1BAr$n`D4% es*deDe99 ze*VQ@O@96hX7Z56vTbN~?c&vEu)vqEvYNRpk%ypXJdN#)c6H%IA~TOq>s;tLS|@JB z4@tVJt!AE CnVFp6QNOs3pA9YunLi-`#0l%3=#YK-)_rzb6p+ zo-6zYWw(9JngM!FvQ5D+qHBG;JpDvI{v5}?f&jj&ucWx!XeRPio6dF|SO}5R zpBx`-yx;x%iO= z0en}Rz__khB44#VAwlQe8L~7iaNer*RSP@*%(Y{gaa5a$Y^ojYK(n=ho|7!|)pjGj zv?a~bH5p5jGMpokj}NU++I}LX8BwsDnT)7DN>!N13K$n%+JUl`T;*gtdYfIu9Io`n zs5nSIhsZcjwM-Wa)s=Eph*ST{(xk nwQ_}tJfI RPd)9YkqWjdi?;IgAYj%yh>918g+x4`IU1W|-ByxXg%CTWfB3Efy zB3DQp`D?qHorNRm? LrPJ!igH?6O+e9^O{uFPUPVe!altmZmwaU>lsxh$s0X zd*NAfFLL;<_Qu_L1QXd*1KOcxMbvhKAw(tuy1z)JNYQpjCUQS&j}XH|zG^GmZkVK- zH5RB>zf&b8VJ>e!U9}bJ%x#zVk!vvc;sgZHbF{10%XG6X+J-fiTu)i-svcX!lc#L+ zgatI5(wMBP+x%BW0N+(LIHqfs$fjD;4mB&Hwx_q*MTkrUbU%?xkuu`$XsR(DFCQlI zRomS5gm#Y1M7}EQhs>YpjOHy~`cCg)BAWu<4mHXKwr6Yik% !Ypx1R FBZz~Q$LaW3(G|A$EJ?K zceTDA*##5%stsy;dd)6M a$GC4&>xt{rn-b3 zYP5!I&rgcHYt`B$k;6dPwnf-Pf`nY8&V*|uwh6-DmwXqM{>R@%GRG_eF73WwO{Q_N z`gT&9PHEl%^9cCleFVQ@b@UlZ>U^B50q5uy6Zt4SCq&wzA}6coY%fUAW0!Qxcp#D2 zkY-=*GMsR%GCWA+c>R*@B|69@Z9LM`Pshns=eEBfT$|=w`O2)b(Y=3{IPIfBGRIl4 zZzucelW~YF%bv)+(WKlb2mP__Ba6sK>)Xytwut2#{j}*QCxgQe>=Cd-jn P>cs1-sO|81PK!9Pl*hdc96!K{rT(J zZ -~X^;(WKrrbnK>rzotDIF@fa zqzUe+3O83)JJPI(+Fmp-zm(~w)prPyG2EOLjS2gDj=b&=S;+kpp=@-C(Df|W=+Jt) zdy+0+Vf`~*+@ _<{hJ&R}gq= O==y4>G8p37)s?Z~$}HbQLQ!uAtn z5cz3Fl_UiRuYiE CA(>}mAuZe)|vu4*d@f~m8=s8-6Jc}3EGG2W>-kRTJ&G22l$#NMe6iZ|SAogcr z`|cd4k?HQ!gsg6n4C=)$a{pM6XnB%gyx3x?c-eEhkt{49d(C~v*}i74|GukKm7a-Q zA#s(z=sEJx1oas6%Db4zuK;vzG`_3nK6>lVF_Ev@LbmT~SFN#0I?Fd(SPs#>{v0At zaqc2+j$!Ds?Y;Lv5?SL7q!*UEieMsNwYh9xYIbesX_1{^I-ZGqrAEPb^-4Lvd$vqu zQ%zv&oM_uVyfK#g!|m4)g%Gl>e2mDNLle;KvO}WVLxM!xs$Ce&o?GV{NNf|tp$WXp zxlBb VxAz8<-1Ok{v>m3y6y0lDUT<@RA4N9 zU^T_rOXLa;s8DX>KWdi|nnxb`3ddM1OKO$BJTweOEALnuWdl2q-Wa f9G>0ad!xGi;iKY~M z)gXWtajXDGW|+tgC>LHimS&F<$8EHlUAtnY9{a)eRQ#-24#Tqcrq$CU3mOfu(bbf- zRGW8C9PT!cmsf;q>v;D24N1}p66TWNaU!=ex>BJ3^ph8&uA@5r6bPJsqo48PxRwVd z;E)8vpL8NOPGG=cjq43AFaunrv)y*{(@Bv|^Ti@d;z>MtiC3_)y!c^*D;!b7_DKAM z@JpIape8Zdz{$yC@rP*^|8%m*WNKuUeT8H@tnuQkTRh3i%NOY}v^=Vj;>aaljn|>` zS7&mMm-{_qaok3`*!7$jTUgDgibm8o`WL(G02`rpp!sAFHjyA9SM}b*UqWOO+YOS; zNszqj)XclDJNZuk=_fC0h&+bVPbWje51fYph^LjvgvcjkUTXboRR0N^NRW_=yzf-5 zk<3YuyzA7=N!cz5l7jVo0xx+3Kl>mEKzM2;G7-Tiput2Q4wi< %;SHPj}V$U~cGd_;zhKM$>kHvie_;QjoP?We}b z@Sy~-lik^Vg0?Lad1wnUk%uD1=~M*ZG -r1bcO@qrgRR4!YKjisnaoM*3q6S5*9C1hfdivs*I#v`VDv zx%wMOWc88qS}T!xv8#hq?~Rd3 ppU9lMViGZ$&yiB*V*5n$F zt+Ci89a~pF5qUNY3s7&2RrEvt6;WVg{f}z90Xdz=%-0}7ZaBJcxtq8sT3*@hhzIJg zfj5?T^ql=M#?RU&_}~q1rFi|52fEQs(%GKwHIX|o*b$U?T7DlvWD8cCf@c`eD{$7k z{lVyD@DMjDB6ljQ^ *H>Pxpy_u?oax-F|E~w$Ay7welh~+Ia-@tgmde7o#l%< z_j8EMi(NH*{TJn0VShBoFakXY*pWX^;$`-U#FJI);X`Y=bxDWTp|CsNAISSS$Ote3 z7a(9qfp%z3n2XJ)Sq97AhhM)$#%2?UtXc H7rwD>t86UU3Elx(NE;bq*NwSG>Sw3jSxPO+6J&MWLp|Xdwq%dJ|j>g01==i zGC4E1E7srF&rBw#5V?A60hP~nI;|8x 2i73+Mp+N5 ziHtp^8FWR4>?rXZc|g0ij++cf&q*E-0Y_-Q_Ks!mx1T=So2joTNr>Ec`l& Hw$ayS%tm`=zyNo%856AT(0H?`AB=TiM#@Q!fu|)1`1LeNf^{o=m zmyCcO0f+$UGNyBAV!ne(5d9-(-o b2LHAE>q7toq`oM=&j=hr03sk+r1`3C z)p|0KL~eO7Ka$6=sFw^!oO7n}QM52XIvUTBjDQ{i$MWa87&1rJC6V_!bL75+e18xE zT1R_>p5#Q2jR1O1qC C=UCB@p>-dTJK!;qJCN`VM!+Znj?fI-u(_-~#yC(ScM8Zv z?m)sf7=h~}0K0hFIWiOZ`q=Xu7y)AlU{W@RkD+w+yLOh#tT4O#)XttmdIYqVPW4Io zE+e2I;0S563ogRQj}Vy%Xp&e7ma8?~9Ti0Qk`XYAfFm?V F^(>OT^&xGI3AW=9Zykf5Fzw4`8+ZOSRZzTVi8=Q9ps=JQ^Z* zAkcnnJE`vI#uZxsj%xpgMa6hKk#l5KsYAY=46XZ!+$m`(QV5aZ`UgH^3=+BX)_c9t z!Nd`Y`@4Is6_@+E2spN;lc49!7mK_|SE?O>$wV?&vDsDnerm{GOXLA1#y1)NiBR{J z0gvmFtm8$xjX$ddvo6VP-@|~jv}2|rvS!qD+jTi!IuV7T<%) UT0ms!5 z*_PfIH|d(>MjV~5vepJwKaoi`2udOg+jjYz++fpBWWiQ68<_ZNI0B9>q>85MLbZID z5Sfg$`|~eF3dDSq0-Y9zDC~$Oa)Sw9F#?7WaBLeAxkzf;^N0M664|#L+hHObZaU8H zK@o6V%|Z$omcTpm7Mrp~yls#%N#xMRa)--AZqVf`M!+xv*tpahsDFtUiv)A$gF4qT z-ln_e)u+sno2U5dRRpvr)Lwmx6EFgf?F~@~A-t}MtWgNTS;>}K0~Wh{IB_#MM~;)_ zWST=Ejhytjo92}32Ex`TE;_d6sOjBQiwpXG2%zUA@n!?Z#n}&PDP}u(L~cwDZ1RO_ zQ?n*={E{wUQ!m|C%GRa&n0Cin&Hd4@j}Uoey4H{0(r;FO5Knvhi4d8Tr=Q3qAqP)G zfIoq!;l-&d1kiJ|7D9*!CTdwVk*jR@uNefi`tWA5=3GXNfMZ9=EL|=e^~-&Ai7FQn z(EUWloLkP3m6;xfkuF@uu&(u}`w>^}oe^*xYsg~PWkhCgjPKma@ArCq#<}$k!|%Ad zLlaJ^*_Fi;Y1tM!UWb>Ol*plFVU3pekqx&eXU7OM2sn;Ce=gz`9FR|&yRakxV*_zg zuT)Rt;wfKYg<4H>+BFk-0A7xx*j5>ko|7;Fdj!yPl5JX~8!|~w;d5;vx0d$F$k6&6 z^q9y4P{Vh1Kq^kc2v7uYwlRUYU8W?0NMyoml2{3rJ+UQML?qxeS)=@*JjIs>1RRI= zk-0Oxf`H>HXOgP4=sA10s^ru}_L3IL$;H`k2M((pM{0ICidHua3xtx$>-=evPFDFr z)06$4S52V))t(tw6Yw=7;CPxt>mc3`B0uNFcDMSv1L87URXSb!INQV5!VWYuJsw(j z(Cgl4eFD4De1{Q$oK%g}R)C=AB=M?avTH&_@DtQH$t=3cq5ao!ur%&C8rjc8ZX=}) zl>-`W%$?p8kz>L1BG3E{wx8qaEQC0r*3$$bvVmf3e)jS+m;zfQY0)+hW+3m;WTE{8 zj;3~8k?SFVo}=~sG*|==E*eYZ0Z^3#ngQuJ2_w)(z;Uhl8rx6pyOYT#UKRQBQ+4|( zEw {@Lue*;lz@oOAfo50Vn!)d#65SJNy4j%yEDwI zc@2i7b1fR<7_I`7PU(-!)zY98WnVTvgL?J?-|> zK+Uc$ku{oKLhl}>Dgys)5O93W4tx`Re^=6C8$5rppAmyi=Xi?ZWR ?dT0;Ujf +*4{$MYMZZW8UL7V z@LH|$U41PH$1?&N1aL?hE@L+7n#2)_On6-rxg(Lwp4gHrBJ@j}UE~E19TZ_yD#>&} z2%LWuOqEuW6_1d}AmAPN0>@o;>|THlI2}>sh?Wp9`%{Nc;7HR38g;sweGqj~x=B z^u=g(7q&vDd+!pcG%bEfcKqzkA^^Qj>?1GYWxPt1)vU=ZE8>OX_ !6$wGTs9aaD0>7Pma&_Mh1X> zZ%Ld$(@7u#wEM_#1c7<+;*9f7JhZ-`V`$ZAFUXG{eG~*B0<^xLioCV V9WsSP7KFZb^9g#)km!7{y*;=<$DaUt{FL&AY_XT{ND?c(v zCIY&j$YoE|&h!X#m3Q$aBftn;h=AjJ@cp#?Zq?>7Jv2cCbWP-Xv8(zD9EhwevcRpX zC+v>ZCc^8-lE_e8j4a=B2?)@M6Pk653!C^|AGa;k(`Fm0CL6&CG-hNR--oVs*M|g= z$Z}|{40&rJcgp7oIGA#T#uR?1({`Ta8;k%W@Hzrcpiwq({9vBsu-Ky*=#p8%l0dxr zx^@{ua_=WHNoXi2b I?X;UMXkJ zcH9WSa_wH%I&JG(6Z^NT>>>wl ^ZIs6tJ5Jn|*zi$M zc+OYbcm?Y}X*p9qB9Y4zjGi(;6n<20KRscn4!4ihOuG~0?WYoN<=mKp|GAfDb33;b z<#V4+Ciox!E=Rx#m9^w5J0}oH*Q)hoVvxvzRi1w8FqiQ9k%%k;JJ23u^lY=M)=cE8 zqmTVB^fuvXVwuyCvq>V0@;ovVx#>$FvR+NXvo#;v<~jY92;lEhce>fLv4wEzPXv3@ zOr7UE`;1|~2r7jTmdG7M&%EJ;nr3wZ2P&G7$;3v8Q6jstn=z3GwVPQPYBsk)73fRE zMD9c8)ca1TSrK&tHz{p)sWW2aY?R2Q^kE_oYB00ZGn?C>3iKsnBKIL< aU4MP*|mp9*(hdMDIwKLuE|p2Es}`^Q9X z gt+0dLXt zp8-!DlCVS`j@9v$PNcC11uYRQcEKSGd6p$I0px9hp7gkLvp**CO*D-YX_O6|&`Lh0 z1&%Q;TU=%$ze}5W;v%wKxy%=pjU}?F)^Q?@vVjwdBz MC2z3nq1ibCkSMFa#m%5rac)%tBg; &jq?Y1f0;DuQ2HSe$y`7OSXs=E1HDY zHIds7AyoFnmR2`9Z2%sN&U~=*EZ<-R7=bepa6*4R+sT8*%T^9Xi5%kmQ$UDJf+sC@ zwMxnXM&Pj!a3amH4JRqIo+faxaa&G|w 1wMRT0a(o*RL(CFkJs7{Du)C00r!X zkhZL4_L3IL^p_+#GPIUGv31T$L^v%Qb ?9_PjpB5Mw|JPs~g)3XtP0=8VW?mSN v-2OEKqz}s&3t0GFZNDGCW3Pm|7IBvSd>d*%mh0I3_{f zM{dyND@NdC1f0m5FEMCVSX$;mh&;=haW&%miQFv!R5amt(6YbT6&Z})FXK|ba(f6? z>C?q#vd)VwQ7}71!-w1!+MPcfg3Elf$tTH=(#@B WE#!k>mZ>01YYM=oa?9%K+l0U#zn_YEfK+^s`Cw3 zrX0}RaQV1sw~BxhMad%XtaVL@qjMsl`{&5z*bw9OZhgt>RyP6PnM_=Z4GVBTI0pgv z`AOo K29XKq3pxGT}V~Bcc$t$uvfd?zvL$Tz2h%7yCj ^ce%NA@6qNf{)v)cF0^3w7ywvB=kPp>9a28T8MQ)l}_ko+G#M(1x&N zp}o&H8G#xB?TV;txpQftzD{+xAVekt`X@o)`?e6>m6>w2rqvxq
l zUYfgnixGGY0oU?C b)%4zEGRs%r#EbggH}M*0`|J9gGe@4mck42pY~ruuS)Fg4<2Ug#@12s@ zsYZVRMZ3}0kt=v10@_aE3L%Hq-+mUuaP_KTGa)kFe(Ehssbi>p(=5ZO$mUzno5O&J zWxAcE1Jd1J5?8aMcYn3u5?>VoXk&KscLi*AK^{M0ElT~pLS(s*?AmVE;c}PA*nqHv zu)Ga?Kf#0nH4dh}bm;ZL_tPeY@1#ZAr?oOPw_8f*3XK}=EftW<^8N@w8?##oh=3#o zyNZ*9 23s87gAk1zW2ZgK&`r4d)StNMD7|Ez#tf|9qROO z;nobS6;Bh}v`9A@_Mq1>l52;}7+T9Yax{gt`z`dxzOOSq`{FsBZnW<@JI7mjP`lTE zD~027+y(;JGVT_{we4iK_^wbLJ;_vr$V5ONS+$mD$XneJ{*is0EVm3UcEvMjgiNyK zGJnFx+1*fj3V$B^ZzERn@maN8>Ebd@lnS`E=40D!HNL|L5CmM?(GIPR5;=s5rb$yj zP()i#;>B*6t?1mIRPWw`uEYDt_ts{&QC=uam%7&Rr1UpY+X*pAWSG#jovy>O+W_EQ zN&$)NTb?7P`7-{j*v)F0>^hnS$#*Ftzx2KkaBXR`D_(s@40jnNGFHHB*Wl3lz92qQ z+6~qW;0s`yu70;q mdLou5RY89VD}KxvU3wha@J69AJuU1qLPZ7Os{zFj6qSpX(0Mu^C^zxke`- z0NsynYS#`EcpjhAedJXP{p)n|*@4hFvb@bVpH++3r>$BC!U`ShNm{{Yf!u8Z^^WUm zb{5nGe9Z`G-H~9wW4_9!`QlT(&Q&6{-2E~Cron6t)3}SYPSQ{0=8@`3o_?|d;m>y1 zG@7T`vWht2FWwEC1Ygr(!wEUuR?;KePa|8kh7-5I(jM2jtrofa(zp(6c1a?)6h0;s zLS!=1?k94&5sJ;}1{ic&$BG2cksC<(iV-l4fa?exV@$uwYH7QFgHa+wqtmf?vCDMZ zaej 117GDgKndeu> x4sw)|W|SA46+laA@6E8NSa5JSqY>ZX=H|&fqns<+&kVY>)V2=^t7@ zDvsyXyL z@
fqSCQ-AOX^ z#yW#D=VJ2Z4qMY&h0mcG-CQ~x55KuGae;0O0T=`6mIw!6acJTxEw=5rbo1pdEs9U= zyH)5MA{*R(ij(E!Ia{HGralc-#oqfbj)%W@5%~RgiGb^R2^71&TeY{5C)o=eLNzsl z&d982ma&fzSxA*Do#EXkGrnR37y-iwxURI>wMo|`-(|c>6lYI3gP17N`3R9oK230w zZD)ogD3-l2w5CQ)npfTLmGDQl{UjpSv+&>jHp!io+;ySZm9E>H$S6A@G7-=}aiH31 zLyLM1vmDFi);HJ2SfA=<1`%-Z{RE9`#pZjF zzhue*vu#Y_Zp5CwA zwH@wHaawuNFukA1wuLPzJ5p5tMJV7O*%EN!*75mB-}>-j*He&tcr+LQEds6G-6{oo zPEwu{PB)Fd2O_5!=Ef_yZrdlE#fwb3Q9C@=Pvk1!<}Zj``bUOAp(Tz&o-LJ|97lYG z@9Kza$5p!?0aEZ&~py^$n6Br zIE<`a=PHvik=tk)3*ozJEHBRJkq~fwu^(Dz?V !A)Qmuh07St2W4u$etoOj+Xrp2vgo4FHrih#tJ|dC% z^wVija_T(-uJ6rtSde{WGSWUqWVu=+c U6;yaAM zEg+z^2j%(!6fd{AVllHUD F$UY4dxr-IwVFYdgftKBl zsz7cal628B>r+NCkt>AwFC%aV2)KbgPx9sOSLw914Mm6yrq2`;ef>jg7+b?JMoT%v zBO=Ea7W*_B)EV4>RWt_y#fb<4=sD7gW=!pX%wlP8mL#r&{Y0*lbS~J`PY06j4SZL- zH~9`D@G1gs0L`wvNT@wrB9RHN`-xok#Fkuv@x9Wpz^g^!1Xv~vc$tvUGuOkN=O3mD+*PxR<9a3(!Y2)OmH+^(=xF|Vv>s;?qL zYr^X~C5|n}u!s#KeTQ3RPsG=uPBFngGJHQ-p24Q b4^g{i>oL90NdP=ZFzM^F%J5Az-P*vw2BXBYT=s5=i_3*oxHck(v5srG1dNP5c z^!D4!WFPV`uq<}Y*Wu(^-R%Rmz;}>;jKIkVxS@X_G7SEFx2pG($ T(k58n*IbkaG}(%#2AKi3 z@Le5{ijyz`6ahC3wYt{vVwn{%sYlcA!{@A8zu>TBxns?PYdxs)u88;(*pCj!^dsPg zdd)6EWU{T?Ph@-;db%SMxxW=Sh7lN!fa_^yu5M%vk;qKs;W%?jM&POlxYEES{Xvxo z+fOrW$ZlIhUTA=9V<=`GR=?JH%Mwt(M5g&SVWP#f*+QLZ3XQV;8d|*Amd@3i^hd6+ zq&|60vsJASbtLUgM)hlUg{;|ilPz}hg>oZ%h=mZs>wY3b {V&iGrlE}+^k*%6L z#V%FPEB6z*TX7KCw|rrDI&C-U&^z&(S|%F$ nl8R0H*}s|lyxmMC(33X*gJcde?2*6~7nPR(3tgp_}bz{v=p z=OpVQf1x67n(c}on%sz@S3i-PNBHUt1n^xw<0*cG5pW|v(HY;P61mOmej=AWu_aeT z6nd5`ESAXJ+ZchXA>c-V*3=IZ`D&1J#*Bb@1l%Z;#`p3SR)N*uYzIXw=xKhf-mI_t zC32mlb0HVLC-VF7{bUmt?YDIjkNk%4f^yxUQ%&39IdTUSzA*p+H;VR$CX^*=`Ixk( zqdZP{-B0AQC*td%JbSp@#Mv{J&jua6=srEJJHoeYt m7otD?m}7d0jPL50>& tMW~kCCBg zv1Zp}wDbkFbUn>kSM;3H(?tB#9!blM<1W3cxAzmdO40m<^oitra2ao;KFH!naq*P@ zu8HR>1p$0lmCy(-h3}y4`NMworo K>|%+0^_JilFapC6a6OF~8PD>x5}AoS z3{+0V2)s1{uBX`)@+^P8hS@z@n2)>FH1D;PcgoPZ$~j& `{;-tt-lj!MomYb;7CS5BH&pOd_QgT6*>O&wA*~SOSe6=JBP>{ z>}Rn$$Sb|hQQhCYl9r K0zeKjBUr^goPSpzEF7=9ej!Zz*1wEnJ>(?dZdyk8N>uL0O zJz*zPsACqYVIN>*l*rKZvIG +i-~;ohU6DK3<9pN znSXi0ozLQ@BEu9`{TU^)!$elGtF2BBtG0)EMQh(#iu3u5kd^s9*@RzBqN|l03u)x z1GTGI(dv>ZmuWGL6L@sc{>~vXD}-pFY~REHseOY(jKClSJP{uJBe#>wV~l+?K2JrH z&o4Fz3qRD`?3(BfwlvT26(i7tfF}+%yGT5lBNJX9k;t+q;_J|4C;X^9k;>ao3MK)J z{pe2VdbVakvU!fL7=a!H&~u<`y-C+3{t7m`SVgnOSo9KEX!iQ+$M}K~=tID>MFMq@ zl%7~LDv?>Us}Fv@&j_51fa^nhlKwnfZ?o&mU7Qp!&ZGYw8CvTfz+LI+e3iq5ChYy- zH{Cs9UHm~0Ly5rF&yk&gSFL+{5JwzA0RB#sWycreWbzaj({!PDe`@7%4v||KJa_;^ z4z+V+C(vvWJ~&uh{UHc=wwokyH1YkWeQH7;IE2I`iknrAOymlQ^Zts!DYe}?PcxA_ zknoK`2zWMZcI}>vPlU)Y%##-@_J2AE#FG;V_ A!CUS-O zWFi7jKS%a#We2`Vf4^5E2=rdA?zc+sUUJvhsQ;noXt$q^53T!&{O+~9ivk=WG9Q|_ zix#}OLV9*IFJjoyBqbvfnee)w$cLe|^2xw_kR>ufmxGMJ`3Sha#*B>TSP6{pVFRkY zKy8%B`eEexHQ^^20Y;#WfaeU-?7B!I!@!?Tuee cRtPybZ-5j3C|swsh^6-ALGflo5?aSh>^#~X>)TmbpuT&@tkOg zuJz#UC*2&`*GnIBHRGHZfd@js)mfi_2uPlbcr{HoQ+1L&jW@maLC&+H`9Mg&TGf7u z>}aMxuV%*y7y-`}NojmfWieoxr7P7MF02d`iaK_`u5~}65bD|L>v%<8)c?SUWBTXF zj%Gn}#6WP>Od;U8wpJpq +zD_#s9>hk&ay?B==dkj1Wxh#cuxXmw@edyD`h@CpKMpcvq( z(t7S7Z;Y1_nQcT=aPwbA;9>;aKrz5m<>tAAY<68nWL5~N;O4)Kz{Lo-fnv9#%FT0O zvkS{wKc2(g#P07`w !08YkTAS@@ZlF6f;fZ7l_iFT2)3|ubS8y7$ zkJ#kXOi|hF-$$nTG~vxlHceN*n@r 5d* 0-c(K=PRoV 3y&kK?y zU*vQd*(i~Dv5Pb%h+J;TrJL<1EaPwD%JQM-YxLpC!yIG;x(ImQ-e%X2r|}w_O`j?y zO_M}+n8;n=`3@s+CIW7#nSWuKbZ^%hrhe3XSMf_+6so0bHMW1%T20ly#$NR-FIMqk zXSyB9p*;fFL|`Zwfin=mGAUFvW5tZmK9eF}rd`{b)eFucG894L=UT(0%8CEB5Wprv zE6f2#U>E{eChgI+F1C5m$GdZgT;!MtCh6oUEj|q^+XJS;Cc*>OnyY*{0$3&;qS-}W zbPka>6M0-R`B7dZ4?n!_U$yo$C)5b|9ApH#2w<61JG5Tqn{B$9&bv>@JLeF2@gu3e z{X2bz4|cb+YF(La$0ovqLBZ8EgMjC|Jt~^5p*2~=?k94o(V!h5^3b|zF%gF4K61P+ z@~@iPP_*-TXszPG*BS)eP@`;so}-n>)4XM`ewJZsTZxVHB(kPNe2XH0?<&2;VMbs8 z0-o<{&m$8eFXNVgJ|>YNQncNXCGvpg7+n$(1*Pf>xBiuz*7Jj;$T#hyPk1K|BddE- z%e0ur$+uNu`iWenX#R>YVinB>j`B)Gc4;@I)4lOsB}wl*$V7gl2K4+;tD;FHGU0VU zk;|TluR~LOblTF MDV$#*R|$jj1Sivj8xe3qxmLYyu?Xfs2P&6Gzs<- zS tm%%O zPWu+s<99FukAZ*}h&hPdsVoz@0}01a21rFR%|Pnn%wg58p?Ys!6R=wNQR2Po!?* z>={a*k8O4D&=Ifz*mE9P=ho+Td(Z176Oqu@^z}zM#VH7Qfs;V`W^~#5B`apxBCE36 z uzv*J~lCF|o{q61( 6j;wd1 z ?n4{ >*s5$HEh1Ptr*nLm8cga}#G9s7D9Xv;Fdd3kVk8Jx1MBabKCm-Y8 zGMyx_1-JT|_O=EYzB&^DFBFG; lwt9O^BqSyD0{#U<5?k@&= zV{EYLC$i3CX7e0hF# Sgt1~@x+H&3UDK4hz0>_-mn;tQU(@*+M8876;u1D+;m)F?~ zT`7@Uo5nI%Ci3Ojat@5Zn<3zZgS;_bCXq{*F|2FdG^&W;h)Zi&Ak-WHZJy&RMxX}) zFZ2&{ n c3&Xt= zw`?=5d5U*T^VMb>ueRUs-}iC%!p9iRL4Raut=a20_g>Cvv ==QuA>c)BvdN$8{o|^BL
z x(4v!T26a &>%QmWm z F8#@|YKLZGOQ8@nuA8suVZpfDqnT)jiiHr{e z_K_o{J3{)D+O|w&1I@)*Faml6yeOKd$u2I4Jtd<=E*HC)$odxGyNrMV1hBd?FYWt~ zyl`%Dsw`#4i)pSLc<7hNBpW3-#kq@lj^VX(?@=#%7rU_b_^6n0y)Qxlx*Ewk-WK1h zv_+1D$b*O0<+5w5JEGH;`^Ze>iyDd_W(1BQ;9K_mDK9=!Icb#0<(?@M`B*z}93yZM z0@&|JmicPCNipbElr*PUV@`|OK>aj+iWiHtIOt=aGqhg7lwZ7B4Lc=qQJrr8;oj{h z>;~R`>A8eAh=6aobDW3(NtdnCk+C%4bw82Ip4i$A#a2scjGY&|S^#r^5ip5>Z&fzC zYLnJw_QbFN;q?(BOQTaT1lE)hhv?bVPXkAJg@Yt|PZPd1GE+aK;vBpd0=@;!uF?lU z`wb?E?3IgMY<#bcFozfcg9!Lmpr0eRP5oRXk#VXKn#D}yrr9t@E{}FLcMey+U|s7D zD12i80=^}^F?J2qo0Q1tolN9bTY$*=(@(x&3n49}I4}?aOv>g@@g`dkt6ec{bZr`& zAyPeLm8F$4sQx+fz}KFbEZ%Hkj%ZA#etPG~%Id<2AaU|XMgY=so-V;-0>TD5SlLre z9Rp6>$O}#i#yD>A!%0uvcH;h_wZ-R=Z@cMkwR9NE9SqceOgDdMe6|tS5~~>JDym)N z$yru3<$2_Mk-bpWlUqgRn&s*rT3hUC;+nvZH*a6q$>zJ2qE@}HD;ZjoDRckOy4*j( zo>qfcWwVPHyBbXRiV-l3fG?c+SMf`hl5>nkiOjyA47VC*#|RJveBmZgoa~HuO%i!; z4TB{zfu4hmfH?$wvDfUPmOIE|*YKgW+z7?ybW_4=KFCCFFySjkz%T;7@Dm(o=$sNZ zN@P|DG2CjL9V0*x@C7ux;OLy(rcT_*BKEPxE-bsY)EaPTqErZB$C?yl4l@GA5b#Bq zeEdV>7rDxqjHNFlGV5Abu<~C<;Qw#$TY4Ntwsrr<9a(p>&)quR;vMjFNJH9`Fu3tU z)jc~UmA2ILp6{yOzw(Uk7i40BMS!tQIt^Yfsgg$!kB?Zai1qv!1UxfXhe(fnAk~jb z$h@>B=<+EeFfsy&IUQ}1BBqLDnpQPzB$er2S|d%XbYoQ9 M>sMC^0P8F7 zN1nyD)-6!@!T ^YO0C_5j1R+N(U^{AU<<>td^QNFUj*a^rfHd03lq;$tkmoBe8dQxK>#yHyGP!J zyXB$I{?tXtt=c_H>X9ua@)QUemR_S0@=KU4m5)xV6Ayo(hmdE+k!9#be6mFAllAcL zXks1otoLk;$iG-9qH99Pgh8J;a%;3DO97j&Z(!209=V2tj~Ia)5pYzcP*s;_i6I>M zCPEg%a14*X$ra}Oml3!H0moNd8LEn~6xIs62uEH*kDS&@s&0;4)!Y7iME)p544U+k zxIHSq!U#MB0@%(*@#aU%Mw4uc<+8gDA97WM5GnsI1=dPE4*>ypf)SWL0@%N5IWk#G z6T0r^$XcnjX`mTiTGzA13|s_Dv)Y(=HiZ8CV+1Znz_X=gS34Z;Cj8GgrLsL@@x|GR zmv$4f@(ejl(;QX&YXSR{#Wrr4l9AF+dg|HMla8E+eH#LpIZ;!C{8ry4#&$M31pr#+ zn{Al=UbS^1 K4AM)gk|71TH`TYq_Y*`b30Kgd-EW?k41N zCN}sA^vIUs8g1i;3wk-XqCHD%#kh42qlO;YHxN&XKjY)QO-JTeqd(7f-Z*kojl3Xx zWJ1^f6vDH8Y *2BkD2=ky0Lu%BX1J z4v&lc-49}Kw_7MnQv5>`?ySaYNigxl{y`c8Xf@>Jic%rvo$i|wELgWQit z@nRJw-}|0;!h6`TJmIK$$hRYanG+S^YZ#|ZX%~#JiugaL @R zXBr}mHb3+89${Bo>@agIczB~A;5mj?YE1~4Y?=EA85?nk!t2gq(gucaF(KEG@DU?0 zHUgf5Y>bduQ)h-T3E8)xNi>)vkNxhrK1Se#fah34gk3jrWZyM>(`7 o#H03 z3$s6H+4}q%Lf%6T9 b65VOk|k&u(kYYaViEA!kH ExX#7%>RlR7zQLHHoyJx-nA2GT;x1Qtdm_56=ahf7Aph}IW-QGEHy(^ zHzA*%XdSRYNDGqo1