Una delle cose più difficili in informatica è avere un’idea a priori sul tempo di esecuzione di un programma.
Mentre ci sono ovviamente tecniche che permettono di studiare l’andamento di un algoritmo, il problema cambia quando si parla di implementazioni.
A volte infatti può succedere che due programmi che implementano due algoritmi per risolvere lo stesso problema, potrebbero avere un andamento diverso rispetto a quello che ci aspettiamo.
Di recente mi è ricapitata sotto mano la tabella con i numeri che ogni programmatore dovrebbe conoscere. Questa tabella, inizialmente stillata da Jeff Dean per un evento di Google, fornisce un’idea del tempo necessario per eseguire delle comuni operazioni.
La colonna di destra indica la distanza che percorribile alla velocità nel dato lasso di tempo e potrebbe essere utile per capire le proporzioni fra una operazione e l’altra
Operation | Time | Distance |
---|---|---|
3.3 GHz CPU Cycle | 0.3 ns | 9 cm |
Referenza ad un dato in cache L1 | 0.5 ns | 15 cm |
Predizione Branch sbagliata | 5 ns | 1.5 m |
Referenza ad un dato in Cache L2 | 7 ns | 2.1 m |
Mutex lock/unlock | 100 ns | 30 m |
Referenza ad un dato in memoria principale | 100 ns | 30 m |
Comprimere 1Kbytes di dati | 10,000 ns | 3 km |
Inviare 2Kbytes su una rete da 1Gbps | 20,000 ns | 6 km |
Lettura sequenziale di 1MB dalla memoria | 250,000 ns | 75 km |
Round trip nello stesso datacenter | 500,000 ns | 150 km |
Effettuare una seek sul disco | 10,000,000 ns | 3000 km |
Lettura sequenziale di 1 MB dal disco | 30,000,000 ns | 9000 km |
Invio di un pacchetto California-Olanda-California | 150,000,000 ns | 45000 km |
Una tabella aggiornata annualmente è disponibile qui.