Boxen gegen ToString für int
Posted: 27 Dec 2024, 11:16
Ich habe ein .net 6-Projekt und schreibe einige Protokolle. Das übliche Protokoll sieht so aus:
Hier findet das Boxen statt (int -> object).
Also habe ich beschlossen, den Code zu ersetzen durch:
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.
Ausgabe:
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?
Code: Select all
int profileId = 100; //Any number
_logger.LogInformation("profileId = {ProfileId}", profileId);
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);
Ü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);
}
}
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 |
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?