loading experience

Architettura e qualità

BenchmarkDotNet: misurare le prestazioni del codice .NET

Smetti di indovinare: come scrivere benchmark affidabili e leggere i risultati senza farsi ingannare.

BenchmarkDotNet: misurare le prestazioni del codice .NET

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.

Il riscaldamento e le ripetizioni eliminano il rumore che falsa le misure fatte a mano.
Il riscaldamento e le ripetizioni eliminano il rumore che falsa le misure fatte a mano.

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.

Lascia un commento