Benchmark: La misurazione della performance

Chi mi segue e/o mi conosce ha ben presente che per me scrivere codice non significa farlo andare. Per me scrivere codice significa farlo andare e bene. Per questo punto molta attenzione alle performance e l’utilizzo di benchmark viene spesso in aiuto. Prima di cominciare, vi consiglio di creare una ConsoleApp per eseguire il tutto ed agganciare i vostri componenti con codice/logiche.
BenchmarkDotNet
Personalmente per scrivere i benchmark del codice utilizzo BenchmarkDotNet. Per usarlo vi bastera’ installarlo tramite Nuget
|
|
oppure
|
|
Una volta installato siamo pronti ad utilizzarlo col nostro codice. Come?
Creazione Benchmark
Per procedere alla creazione del nostro Benchmark non dovremo fare altro che creare una nuova classe dedicata aggiungendo i seguenti using. A dire il vero quello che serve sicuro e’ BenchmarkDotNet.Attributes. L’aggiunta di Linq e’ solo per il mio esempio.
|
|
Come creo la classe? Ecco un breve template d’esempio.
|
|
Come avrete notato due metodi sono entrambi marcati con l’attributo [Benchmark].
Esecuzione Benchmark
Per eseguire la batteria di Benchmark presenti in una classe dovremmo (in una nuova classe) scrivere la seguente istruzione:
|
|
|
|
ATTENZIONE: Per eseguire il tutto dovrete essere in modalita’ Release
A questo punto non ci resta che aspettare il completamento della batteria di Benchmark ed andare a vedere i risultati. Come farlo?
- Avviando i test verra’ mostrata una console coi risultati live
- Nella cartella bin\Release ( ed entrando in net5.0 nel mio caso) troverete BenchmarkDotNet.Artifacts\results
Vi mostro il risultato dei Benchmark appena eseguiti
|
|
Method | Mean | Error | StdDev | StdErr | Median | Min | Q1 | Q3 | Max | Op/s |
---|---|---|---|---|---|---|---|---|---|---|
DoSomethingOne | 26.03 ns | 0.538 ns | 0.477 ns | 0.128 ns | 25.92 ns | 25.55 ns | 25.64 ns | 26.14 ns | 27.15 ns | 38,422,919.6 |
DoSomethingTwo | 3,538.31 ns | 517.654 ns | 1,526.313 ns | 152.631 ns | 2,554.10 ns | 2,359.16 ns | 2,470.42 ns | 5,744.71 ns | 6,168.55 ns | 282,621.0 |
Benchmark Debug Mode
Nel punto precedente ho specificato che per l’esecuzione del Benchmark dovete essere in modalita’ Release. Cosa succede se mi dimentico la modalita’ Debug?
// Validating benchmarks:
Assembly ConsoleApp3 which defines benchmarks is non-optimized
Benchmark was built without optimization enabled (most probably a DEBUG configuration). Please, build it in RELEASE.
If you want to debug the benchmarks, please see https://benchmarkdotnet.org/articles/guides/troubleshooting.html#debugging-benchmarks.
Ecco, come avrete notato e’ impossibile dimenticarsi di passare alla modalita’ corretta. Tranquilli, il messaggio appare in rosso e quindi fare gli indifferenti e’ impossibile!