Se si sta veramente ricevendo la prima riga e si leggono centinaia di file, quindi si considerino i builtin di shell invece dei comandi esterni esterni, utilizzare read
che è una shell incorporata per bash e ksh.Questo elimina l'overhead di creazione di processo con awk
, sed
, head
, ecc
L'altra questione sta facendo l'analisi delle prestazioni cronometrato su I/O. La prima volta che apri e poi leggi un file, i dati del file probabilmente non vengono memorizzati nella memoria. Tuttavia, se si prova nuovamente un secondo comando sullo stesso file, i dati e l'inode sono stati memorizzati nella cache, quindi i risultati a tempo potrebbero essere più veloci, praticamente indipendentemente dal comando che si utilizza. Inoltre, gli inode possono rimanere memorizzati nella cache praticamente per sempre. Lo fanno su Solaris per esempio. O comunque, diversi giorni.
Ad esempio, linux memorizza nella cache tutto e il lavello della cucina, che è un buon attributo di prestazione. Ma rende problematico il benchmarking se non si è a conoscenza del problema.
Tutte queste "interferenze" di effetto di memorizzazione nella cache dipendono dal sistema operativo e dall'hardware.
Quindi, scegli un file, leggilo con un comando. Ora è memorizzato nella cache. Esegui lo stesso comando di prova diverse decine di volte, questo è il campionamento dell'effetto del comando e della creazione del processo figlio, non il tuo hardware I/O.
questo è sed vs lettura per 10 iterazioni di ottenere la prima linea dello stesso file, dopo aver letto il file una volta:
sed: sed '1{p;q}' uopgenl20121216.lis
real 0m0.917s
user 0m0.258s
sys 0m0.492s
lettura: read foo < uopgenl20121216.lis ; export foo; echo "$foo"
real 0m0.017s
user 0m0.000s
sys 0m0.015s
Questo è chiaramente inventato, ma mostra la differenza tra prestazioni incorporate e utilizzo di un comando.
Usa 'time' per misurare la comandi. – choroba
Perché pipe 'cat' negli strumenti? Possono entrambi aprire i file autonomamente e, se sei preoccupato dell'efficienza, probabilmente possono farlo meglio. Ma sì, il tubo dovrebbe "trasmettere" solo i primi blocchi del file (e poi notare che il consumatore ha smesso di preoccuparsi). – Thilo