Ho scoperto che il solito clock (), tutti raccomandano qui, per qualche ragione si discosta selvaggiamente da una corsa all'altra, anche per codice statico senza effetti collaterali, come disegnare sullo schermo o leggere file. Potrebbe essere perché la CPU modifica le modalità di consumo energetico, il sistema operativo dà priorità diverse, ecc ...
Quindi l'unico modo per ottenere lo stesso risultato in modo affidabile ogni volta con clock () è eseguire il codice misurato in un ciclo più volte (per diversi minuti), prendendo precauzioni per impedire al compilatore di ottimizzarlo: i moderni compilatori possono precompilare il codice senza effetti collaterali in esecuzione in un ciclo e spostarlo fuori dal ciclo., come ad esempio l'uso di input casuali per ogni iterazione.
Dopo aver raccolto un numero sufficiente di campioni in un array, si ordina quell'array e si prende l'elemento centrale, chiamato mediana. La mediana è migliore della media, perché elimina deviazioni estreme, come ad esempio l'antivirus che occupa tutta la CPU o il sistema operativo che esegue un aggiornamento.
Ecco una semplice utility per misurare le prestazioni di esecuzione del codice C / C ++, calcolando la media dei valori vicino alla mediana: https://github.com/saniv/gauge
Sono ancora alla ricerca di un modo più robusto e veloce per misurare il codice. Probabilmente si potrebbe provare a eseguire il codice in condizioni controllate su bare metal senza alcun sistema operativo, ma ciò darà risultati non realistici, perché in realtà il sistema operativo viene coinvolto.
x86 ha questi contatori delle prestazioni hardware, che includono il numero effettivo di istruzioni eseguite, ma sono difficili da accedere senza l'aiuto del sistema operativo, difficili da interpretare e hanno i loro problemi ( http://archive.gamedev.net/archive/reference/articles /article213.html ). Potrebbero comunque essere utili indagare la natura del collo della bottiglia (accesso ai dati o calcoli effettivi su tali dati).