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?