From 442ca66de6b68f58e72985aad602895583391b3e Mon Sep 17 00:00:00 2001 From: Steven Giesel Date: Sat, 22 Feb 2025 23:02:28 +0100 Subject: [PATCH] Update some benchmarks --- README.md | 31 +++++++++++++++---------------- docs/site/articles/comparison.md | 23 +++++++++++++++-------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 4124b70..a2acc59 100644 --- a/README.md +++ b/README.md @@ -53,18 +53,17 @@ More detailed documentation can be found [here](https://linkdotnet.github.io/Str The following table compares the built-in `StringBuilder` and this library's `ValueStringBuilder`: ```no-class -BenchmarkDotNet=v0.13.2, OS=macOS Monterey 12.6.1 (21G217) [Darwin 21.6.0] -Apple M1 Pro, 1 CPU, 10 logical and 10 physical cores -.NET SDK=7.0.100-rc.2.22477.23 - [Host] : .NET 6.0.10 (6.0.1022.47605), Arm64 RyuJIT AdvSIMD - DefaultJob : .NET 6.0.10 (6.0.1022.47605), Arm64 RyuJIT AdvSIMD - - -| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Allocated | Alloc Ratio | -|------------------------------- |-----------:|---------:|---------:|------:|--------:|--------:|----------:|------------:| -| DotNetStringBuilder | 227.3 ns | 1.31 ns | 1.22 ns | 1.00 | 0.00 | 0.7114 | 1488 B | 1.00 | -| ValueStringBuilder | 128.7 ns | 0.57 ns | 0.53 ns | 0.57 | 0.00 | 0.2677 | 560 B | 0.38 | -| ValueStringBuilderPreAllocated | 113.9 ns | 0.67 ns | 0.60 ns | 0.50 | 0.00 | 0.2677 | 560 B | 0.38 | +BenchmarkDotNet v0.14.0, macOS Sequoia 15.3.1 (24D70) [Darwin 24.3.0] +Apple M2 Pro, 1 CPU, 12 logical and 12 physical cores +.NET SDK 9.0.200 + [Host] : .NET 9.0.2 (9.0.225.6610), Arm64 RyuJIT AdvSIMD + DefaultJob : .NET 9.0.2 (9.0.225.6610), Arm64 RyuJIT AdvSIMD + + +| Method | Mean | Error | StdDev | Ratio | Gen0 | Allocated | Alloc Ratio | +|-------------------- |----------:|---------:|---------:|------:|-------:|----------:|------------:| +| DotNetStringBuilder | 126.74 ns | 0.714 ns | 0.667 ns | 1.00 | 0.1779 | 1488 B | 1.00 | +| ValueStringBuilder | 95.69 ns | 0.118 ns | 0.110 ns | 0.76 | 0.0669 | 560 B | 0.38 | ``` For more comparisons, check the documentation. @@ -72,10 +71,10 @@ For more comparisons, check the documentation. Another benchmark shows that `ValueStringBuilder` allocates less memory when appending value types (such as `int` and `double`): ```no-class -| Method | Mean | Error | StdDev | Gen 0 | Allocated | -|-------------------- |---------:|---------:|---------:|-------:|----------:| -| DotNetStringBuilder | 17.21 us | 0.622 us | 1.805 us | 1.5259 | 6 KB | -| ValueStringBuilder | 16.24 us | 0.496 us | 1.462 us | 0.3357 | 1 KB | +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated | +|------------------------------- |---------:|--------:|--------:|-------:|-------:|----------:| +| ValueStringBuilderAppendFormat | 821.7 ns | 1.29 ns | 1.14 ns | 0.4330 | - | 3.54 KB | +| StringBuilderAppendFormat | 741.5 ns | 5.58 ns | 5.22 ns | 0.9909 | 0.0057 | 8.1 KB | ``` Check out the [Benchmark](tests/LinkDotNet.StringBuilder.Benchmarks) for a more detailed comparison and setup. diff --git a/docs/site/articles/comparison.md b/docs/site/articles/comparison.md index a38bb49..f68bf46 100644 --- a/docs/site/articles/comparison.md +++ b/docs/site/articles/comparison.md @@ -22,10 +22,17 @@ The `StringBuilder` shipped with the .NET Framework itself is a all-purpose stri The following table gives you a small comparison between the `StringBuilder` which is part of .NET and the `ValueStringBuilder`: ``` -| Method | Mean | Error | StdDev | Median | Ratio | RatioSD | Gen 0 | Gen 1 | Allocated | -|-------------------- |-----------:|---------:|----------:|-----------:|------:|--------:|--------:|-------:|----------:| -| DotNetStringBuilder | 401.7 ns | 29.15 ns | 84.56 ns | 373.4 ns | 1.00 | 0.00 | 0.3576 | - | 1,496 B | -| ValueStringBuilder | 252.8 ns | 9.05 ns | 26.27 ns | 249.0 ns | 0.65 | 0.13 | 0.1583 | - | 664 B | +BenchmarkDotNet v0.14.0, macOS Sequoia 15.3.1 (24D70) [Darwin 24.3.0] +Apple M2 Pro, 1 CPU, 12 logical and 12 physical cores +.NET SDK 9.0.200 + [Host] : .NET 9.0.2 (9.0.225.6610), Arm64 RyuJIT AdvSIMD + DefaultJob : .NET 9.0.2 (9.0.225.6610), Arm64 RyuJIT AdvSIMD + + +| Method | Mean | Error | StdDev | Ratio | Gen0 | Allocated | Alloc Ratio | +|-------------------- |----------:|---------:|---------:|------:|-------:|----------:|------------:| +| DotNetStringBuilder | 126.74 ns | 0.714 ns | 0.667 ns | 1.00 | 0.1779 | 1488 B | 1.00 | +| ValueStringBuilder | 95.69 ns | 0.118 ns | 0.110 ns | 0.76 | 0.0669 | 560 B | 0.38 | ``` For more comparison check the documentation. @@ -34,10 +41,10 @@ Another benchmark shows that this `ValueStringBuilder` uses less memory when it ``` -| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Allocated | -|-------------------- |---------:|---------:|---------:|--------:|-------:|----------:| -| DotNetStringBuilder | 16.31 us | 0.414 us | 1.208 us | 1.5259 | - | 6 KB | -| ValueStringBuilder | 14.61 us | 0.292 us | 0.480 us | 0.3357 | - | 1 KB | +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated | +|------------------------------- |---------:|--------:|--------:|-------:|-------:|----------:| +| ValueStringBuilderAppendFormat | 821.7 ns | 1.29 ns | 1.14 ns | 0.4330 | - | 3.54 KB | +| StringBuilderAppendFormat | 741.5 ns | 5.58 ns | 5.22 ns | 0.9909 | 0.0057 | 8.1 KB | ```