From 45fef514a81e1917dbcef6376b9b2066ba6d8aee Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 25 Oct 2026 13:17:59 +0100 Subject: [PATCH] ConvertInt2String: move to net10.0, BenchmarkDotNet harness, culture tests Retarget both projects to net10.0, update MSTest to 4.5.1 and the test SDK and coverlet to current releases, replace the Stopwatch benchmark (whose ConvertToString case measured ToString) with a BenchmarkDotNet class run through BenchmarkSwitcher, and add two tests for the negative sign under sv-SE and the invariant culture. --- .../ConvertInt2String/Benchmark.cs | 137 +++--------------- .../ConvertInt2String.csproj | 6 +- .../ConvertInt2String/Program.cs | 15 +- .../ConvertInt2StringTests.cs | 21 ++- .../ConvertInt2StringTests.csproj | 10 +- 5 files changed, 61 insertions(+), 128 deletions(-) diff --git a/strings-csharp/ConvertInt2String/ConvertInt2String/Benchmark.cs b/strings-csharp/ConvertInt2String/ConvertInt2String/Benchmark.cs index 20733a8284..2b1094e5ae 100644 --- a/strings-csharp/ConvertInt2String/ConvertInt2String/Benchmark.cs +++ b/strings-csharp/ConvertInt2String/ConvertInt2String/Benchmark.cs @@ -1,126 +1,35 @@ -using System; using System.Text; -using System.Diagnostics; +using BenchmarkDotNet.Attributes; -namespace ConvertInt2String -{ - public static class Benchmark - { - const int formatOffsetLeft = 23; - const int formatOffsetRight = 10; - - static string BenchmarkToString(int num, int reps) - { - var watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < reps; i++) - { - var tmpResult = num.ToString(); - } - watch.Stop(); +namespace ConvertInt2String; - return $"|{"'ToString'",formatOffsetLeft} | {watch.ElapsedMilliseconds,formatOffsetRight:N0}|"; - } - static string BenchmarkConvertToString(int num, int reps) - { - var watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < reps; i++) - { - var tmpResult = num.ToString(); - } - watch.Stop(); - - return $"|{"'ConvertToString'",formatOffsetLeft} | {watch.ElapsedMilliseconds,formatOffsetRight:N0}|"; - } - static string BenchmarkStringFormat(int num, int reps) - { - var watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < reps; i++) - { - var tmpResult = string.Format("{0}", num); - } - watch.Stop(); +[MemoryDiagnoser] +public class IntToStringBenchmarks +{ + [Params(3, 1_234_567)] + public int Number { get; set; } - return $"|{"'String.Format'",formatOffsetLeft} | {watch.ElapsedMilliseconds,formatOffsetRight:N0}|"; - } - static string BenchmarkStringInterpolation(int num, int reps) - { - var watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < reps; i++) - { - var tmpResult = $"{num}"; - } - watch.Stop(); + [Benchmark(Baseline = true)] + public string IntToString() => Number.ToString(); - return $"|{"'String Interpolation'",formatOffsetLeft} | {watch.ElapsedMilliseconds,formatOffsetRight:N0}|"; - } - static string BenchmarkStringConcat(int num, int reps) - { - var watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < reps; i++) - { - var tmpResult = string.Concat(string.Empty, num); - } - watch.Stop(); + [Benchmark] + public string ConvertToString() => Convert.ToString(Number); - return $"|{"'String.Concat'",formatOffsetLeft} | {watch.ElapsedMilliseconds,formatOffsetRight:N0}|"; - } - static string BenchmarkStringJoin(int num, int reps) - { - var watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < reps; i++) - { - var tmpResult = string.Join(string.Empty, num); - } - watch.Stop(); + [Benchmark] + public string StringFormat() => string.Format("{0}", Number); - return $"|{"'String.Join'",formatOffsetLeft} | {watch.ElapsedMilliseconds,formatOffsetRight:N0}|"; - } - static string BenchmarkPlusSign(int num, int reps) - { - var watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < reps; i++) - { - var tmpResult = string.Empty + num; - } - watch.Stop(); + [Benchmark] + public string StringInterpolation() => $"{Number}"; - return $"|{"'Plus sign'",formatOffsetLeft} | {watch.ElapsedMilliseconds,formatOffsetRight:N0}|"; - } - static string BenchmarkStringBuilderAppend(int num, int reps) - { - var watch = new Stopwatch(); - watch.Start(); - for (int i = 0; i < reps; i++) - { - var tmpResult = new StringBuilder().Append(num).ToString(); - } - watch.Stop(); + [Benchmark] + public string StringConcat() => string.Concat(string.Empty, Number); - return $"|{"'Stringbuilder Append'",formatOffsetLeft} | {watch.ElapsedMilliseconds,formatOffsetRight:N0}|"; - } + [Benchmark] + public string StringJoin() => string.Join(string.Empty, Number); - public static string Run(int number, int repetitions) - { - var benchmarkResultsBuilder = new StringBuilder($"\r\nBenchmarks with {repetitions:N0} repetitions: \r\n") - .AppendLine($"|{"Method",formatOffsetLeft} | {"Speed (ms)",formatOffsetRight}|") - .AppendLine($"|{"-----------------------",formatOffsetLeft}-|-{"----------",formatOffsetRight}|") - .AppendLine(BenchmarkToString(number, repetitions)) - .AppendLine(BenchmarkConvertToString(number, repetitions)) - .AppendLine(BenchmarkStringFormat(number, repetitions)) - .AppendLine(BenchmarkStringInterpolation(number, repetitions)) - .AppendLine(BenchmarkStringConcat(number, repetitions)) - .AppendLine(BenchmarkStringJoin(number, repetitions)) - .AppendLine(BenchmarkPlusSign(number, repetitions)) - .AppendLine(BenchmarkStringBuilderAppend(number, repetitions)); + [Benchmark] + public string PlusSign() => string.Empty + Number; - return benchmarkResultsBuilder.ToString(); - } - } + [Benchmark] + public string StringBuilderAppend() => new StringBuilder().Append(Number).ToString(); } diff --git a/strings-csharp/ConvertInt2String/ConvertInt2String/ConvertInt2String.csproj b/strings-csharp/ConvertInt2String/ConvertInt2String/ConvertInt2String.csproj index 74abf5c976..62be4f867f 100644 --- a/strings-csharp/ConvertInt2String/ConvertInt2String/ConvertInt2String.csproj +++ b/strings-csharp/ConvertInt2String/ConvertInt2String/ConvertInt2String.csproj @@ -2,9 +2,13 @@ Exe - net6.0 + net10.0 enable enable + + + + diff --git a/strings-csharp/ConvertInt2String/ConvertInt2String/Program.cs b/strings-csharp/ConvertInt2String/ConvertInt2String/Program.cs index 5ca32b5b00..4b0577cafa 100644 --- a/strings-csharp/ConvertInt2String/ConvertInt2String/Program.cs +++ b/strings-csharp/ConvertInt2String/ConvertInt2String/Program.cs @@ -1,5 +1,7 @@ -using ConvertInt2String; +using System.Globalization; using System.Text; +using BenchmarkDotNet.Running; +using ConvertInt2String; var luckyNumber = 3; @@ -14,11 +16,10 @@ Console.WriteLine(luckyNumber + luckyNumber + string.Empty + luckyNumber + luckyNumber); Console.WriteLine(new StringBuilder().Append(luckyNumber).ToString()); -Console.WriteLine(Benchmark.Run(luckyNumber, 200000)); -Console.WriteLine(Benchmark.Run(luckyNumber, 2000000)); - -Console.ReadLine(); - - +var negativeNumber = -5; +var swedish = CultureInfo.GetCultureInfo("sv-SE"); +Console.WriteLine(negativeNumber.ToString(swedish) == "-5"); +Console.WriteLine(negativeNumber.ToString(CultureInfo.InvariantCulture) == "-5"); +BenchmarkSwitcher.FromAssembly(typeof(IntToStringBenchmarks).Assembly).Run(args); diff --git a/strings-csharp/ConvertInt2String/ConvertInt2StringTests/ConvertInt2StringTests.cs b/strings-csharp/ConvertInt2String/ConvertInt2StringTests/ConvertInt2StringTests.cs index a7be5cba64..1c7c54b12f 100644 --- a/strings-csharp/ConvertInt2String/ConvertInt2StringTests/ConvertInt2StringTests.cs +++ b/strings-csharp/ConvertInt2String/ConvertInt2StringTests/ConvertInt2StringTests.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Globalization; using System.Text; namespace ConvertInt2StringTests @@ -77,5 +78,23 @@ public void GivenInt_WhenConvertedToStringWithStringBuilderAppend_ThenReturnStri Assert.AreEqual("3", str); } + + [TestMethod] + public void GivenNegativeInt_WhenConvertedWithSwedishCulture_ThenUsesUnicodeMinusSign() + { + var num = -5; + var str = num.ToString(CultureInfo.GetCultureInfo("sv-SE")); + + Assert.AreEqual("\u22125", str); + } + + [TestMethod] + public void GivenNegativeInt_WhenConvertedWithInvariantCulture_ThenUsesHyphenMinus() + { + var num = -5; + var str = num.ToString(CultureInfo.InvariantCulture); + + Assert.AreEqual("-5", str); + } } -} \ No newline at end of file +} diff --git a/strings-csharp/ConvertInt2String/ConvertInt2StringTests/ConvertInt2StringTests.csproj b/strings-csharp/ConvertInt2String/ConvertInt2StringTests/ConvertInt2StringTests.csproj index f72bee824b..b01ea88a90 100644 --- a/strings-csharp/ConvertInt2String/ConvertInt2StringTests/ConvertInt2StringTests.csproj +++ b/strings-csharp/ConvertInt2String/ConvertInt2StringTests/ConvertInt2StringTests.csproj @@ -1,17 +1,17 @@ - net6.0 + net10.0 enable false - - - - + + + +