Page 1 of 1

Boxen gegen ToString für int

Posted: 27 Dec 2024, 11:16
by Guest
Ich habe ein .net 6-Projekt und schreibe einige Protokolle. Das übliche Protokoll sieht so aus:

Code: Select all

int profileId = 100; //Any number
_logger.LogInformation("profileId = {ProfileId}", profileId);
Hier findet das Boxen statt (int -> object).
Also habe ich beschlossen, den Code zu ersetzen durch:

Code: Select all

int profileId = 100; //Any number
string profileIdString = profileId.ToString();
_logger.LogInformation("profileId = {ProfileId}", profileIdString);
Ich habe mich jedoch entschieden, den Benchmark durchzuführen und beide Optionen zu vergleichen.
Überraschenderweise sind die Ergebnisse nicht die, die ich erwartet hatte.
Hier ist der Code.

Code: Select all

[MemoryDiagnoser]
public class Benchmark
{
private const int N = 1000;

[Benchmark]
public void Boxing()
{
for (var i = 0; i < N; i++)
{
var s = string.Format("Test: {0}", i);
}
}

[Benchmark]
public void CastToString()
{
for (var i = 0; i < N; i++)
{
var s = string.Format("Test: {0}", i.ToString());
}
}
}

public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run(typeof(Program).Assembly);
}
}
Ausgabe:

Code: Select all

|       Method |     Mean |    Error |   StdDev |  Gen 0 | Allocated |
|------------- |---------:|---------:|---------:|-------:|----------:|
|       Boxing | 26.41 us | 0.236 us | 0.221 us | 4.8828 |     62 KB |
| CastToString | 32.91 us | 0.297 us | 0.278 us | 5.4626 |     70 KB |
Es sieht so aus, als ob der Box-Ansatz besser funktioniert: Er läuft schneller und reserviert weniger Speicher.
Meine Frage ist, warum passiert das? Bedeutet das, dass es in solchen Fällen besser ist, den Boxansatz zu verwenden? Oder habe ich den Leistungstest falsch geschrieben?