Misurare il tempo con uno Stopwatch in un ciclo dà numeri falsati da JIT, cache e garbage collector. BenchmarkDotNet gestisce riscaldamento, ripetizioni e statistiche al posto tuo.
Un benchmark completo
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
BenchmarkRunner.Run<ConcatenazioneBenchmark>();
[MemoryDiagnoser]
public class ConcatenazioneBenchmark
{
[Params(10, 1000)]
public int N;
[Benchmark(Baseline = true)]
public string ConPiu()
{
var s = "";
for (var i = 0; i < N; i++) s += i;
return s;
}
[Benchmark]
public string ConStringBuilder()
{
var sb = new System.Text.StringBuilder();
for (var i = 0; i < N; i++) sb.Append(i);
return sb.ToString();
}
}
dotnet run -c Release
Leggere i risultati
- Mean: tempo medio per operazione.
- Error e StdDev: quanto sono stabili le misure; se sono grandi, il risultato è poco affidabile.
- Ratio: confronto con il metodo segnato come baseline.
- Allocated: memoria allocata per operazione, spesso più importante del tempo.
Confrontare versioni di .NET
Lo stesso benchmark può girare su più runtime, per esempio con l'opzione --runtimes net8.0 net10.0 da riga di comando: è il modo più concreto per valutare un aggiornamento.
Regole d'oro
Sempre in configurazione Release, mai con il debugger collegato, con dati realistici e misurando ciò che conta davvero per l'utente. Ottimizza solo il codice che un profiler o un benchmark indicano come collo di bottiglia.
Commenti (0)
Nessun commento ancora.