33.6. Ottimizzazioni

La maggior parte degli script di shell rappresentano delle soluzioni rapide e sommarie per problemi non troppo complessi. Come tali, la loro ottimizzazione, per una esecuzione veloce, non è una questione importante. Si consideri il caso, comunque, di uno script che esegue un compito rilevante, lo fa bene, ma troppo lentamente. Riscriverlo in un linguaggio compilato potrebbe non essere un'opzione accettabile. La soluzione più semplice consiste nel riscrivere le parti dello script che ne rallentano l'esecuzione. È possibile applicare i principi di ottimizzazione del codice anche ad un modesto script di shell?

Si controllino i cicli dello script. Il tempo impiegato in operazioni ripetitive si somma rapidamente. Per quanto possibile, si tolgano dai cicli le operazioni maggiormente intensive in termini di tempo.

È preferibile usare i comandi builtin invece dei comandi di sistema. I builtin vengono eseguiti più velocemente e, di solito, non generano, quando vengono invocati, delle subshell.

Si evitino i comandi inutili, in modo particolare nelle pipe.

cat "$file" | grep "$parola"

grep "$parola" "$file"

#  Le due linee di comando hanno un effetto identico, ma la seconda viene
#+ eseguita più velocemente perché lancia un sottoprocesso in meno.
Sembra che, negli script, ci sia la tendenza ad abusare del comando cat.

Si usino time e times per calcolare il tempo impiegato nell'esecuzione dei comandi. Si prenda in considerazione la possibilità di riscrivere sezioni di codice critiche, in termini di tempo, in C, se non addirittura in assembler.

Si cerchi di minimizzare l'I/O di file. Bash non è particolarmente efficiente nella gestione dei file. Si consideri, quindi, l'impiego di strumenti più appropriati allo scopo, come awk o Perl.

Si scrivano gli script in forma coerente e strutturata, così che possano essere riorganizzati e accorciati in caso di necessità. Alcune delle tecniche di ottimizzazione applicabili ai linguaggi di alto livello possono funzionare anche per gli script, ma altre, come lo svolgimento del ciclo, sono per lo più irrilevanti. Soprattutto, si usi il buon senso.

Per un'eccellente dimostrazione di come l'ottimizzazione possa ridurre drasticamente il tempo di esecuzione di uno script, vedi Esempio 15-42.