First, and maybe not so surprisingly, I found great performance differences when running the same code on two different machines (up to 6 x faster on one machine).
Then however and very much to my own surprise, running the exactly same code on the same machine on two different days showed great performance differences.
La misurazione delle prestazioni è un argomento sorprendentemente difficile e differenze enormi come quelle che hai osservato sono molto comuni. Ci sono molti pregiudizi di misurazione noti come:
- Il rumore del sistema operativo, come suggerito dalla risposta di DFord
- Politiche del sistema operativo (come scheduler, memory mapper e IO-cache)
- Variabili d'ambiente, anche non utilizzate
- Allineamento memoria
- Localizzazione memoria
Ciascuno di questi parametri può influenzare notevolmente le prestazioni del tuo programma. Se vuoi preparare il tuo programma "ad alte prestazioni", allora:
-
Definisci strategie per disinfettare l'ambiente in modo da ottenere il controllo sui parametri 1-5 sopra.
-
Definisci test per determinare quale combinazione di parametri fa bene.
Il punto chiave qui è che gli esperimenti devono essere riproducibili. Se non sei in grado di riprodurre un esperimento, allora include una fonte di casualità di cui hai bisogno per capire. E prima di tutto, se non riesci a riprodurre un esperimento, i risultati degli esperimenti sono random e probabilmente non vuoi prendere decisioni basate su valori casuali , vero?
Anche se questa non è la domanda che hai posto, suppongo che tu sia interessato alla misurazione delle prestazioni. Ecco alcuni riferimenti che ti suggerisco:
link
Boehm commenta la velocità di esecuzione per lo stesso binario
che varia di un fattore di 2 a seconda sul posizionamento della cache
link
Produzione di dati errati senza fare nulla Ovviamente sbagliato!
È molto facile da leggere, contiene risultati sorprendenti e dà molto
buona sensazione della difficoltà di misurazione delle prestazioni e alcuni
metodi per produrre (più) risultati affidabili.
link
"Lo stabilizzatore è un sistema di compilazione e runtime che abilita statisticamente
rigorosa valutazione delle prestazioni. "Esiste una pubblicazione scientifica
sostenendo di dimostrare che -O3
e -O2
in gcc
non sono distinguibili,
troverai molti riferimenti interessanti in là.
Come ultima parola, hai appena scoperto con le tue misure che l'orologio da parete non fornisce informazioni utili quando si tratta di misurare le prestazioni dei programmi, in modo da non ottenere mai una risposta utile a una domanda come "quanto tempo corre il mio programma? "e devi considerare affermazioni più precise.