Al giorno d'oggi, IMO, non v'è alcuna ragione per usare time
a fini di benchmarking. Utilizzare invece perf stat
.Ti dà molte più informazioni utili e può ripetere il processo di benchmarking ogni dato numero di volte e fare statistiche sui risultati, cioè calcolare la varianza e il valore medio. Questo è molto più affidabile e altrettanto semplice da usare come time
:
perf stat -r 10 -d <your app and arguments>
Il -r 10
verrà eseguito la vostra applicazione per 10 volte e fare statistiche su di esso. -d
emette alcuni più dati, ad esempio errori di cache.
Così mentre time
potrebbe essere abbastanza affidabile per le applicazioni di lunga durata, sicuramente non è affidabile quanto perf stat
. Usalo invece.
Addendum: Se davvero si vuole continuare a utilizzare time
, almeno non utilizzare il comando bash-incorporato, ma il vero affare-in modalità dettagliata:
/usr/bin/time -v <some command with arguments>
L'uscita è quindi, per esempio :
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1968
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 93
Voluntary context switches: 1
Involuntary context switches: 2
Swaps: 0
File system inputs: 8
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
Soprattutto notare come questo sia in grado di misurare l'RSS di picco, che è abbastanza spesso, se si desidera confrontare l'effetto di un cerotto sul consumo di memoria di picco. Cioè usa quel valore per confrontare prima/dopo e se c'è una diminuzione significativa nel picco RSS, allora hai fatto qualcosa di giusto.
Quanto dura il runtime di una singola esecuzione? Se è inferiore a un secondo, probabilmente avrai errori sistematici a causa della scarsa precisione e gli errori sistematici non verranno eliminati facendo una media. –
In generale, il codice che vorrei profilare in primo luogo avrebbe tempi di esecuzione molto più lunghi di un secondo. – chrisdotcode
Inoltre, anche se il codice intensivo avesse tempi di esecuzione inferiori al secondo, l'esecuzione di tale operazione un milione di volte * all'interno * del programma attenuerebbe gli errori sistematici? In questo modo, "tempo" sarebbe confrontato con un milione di giri di pippo con un milione di giri di barre. – chrisdotcode