Je me demandais s'il y avait des directives générales pour optimiser les scripts Bash.
Par exemple, il est plus pratique d'écrire des boucles que des lignes de commandes, mais est-il également plus rapide à traiter pour le système? Exemple:
for i in a b c; do echo $i; done echo a echo b echo c
Parfois, les gens présentent des solutions différentes pour le même problème. Par exemple,
sed
,cut
,awk
etecho
sont tous capables de dépouiller les chiffres d'une chaîne. Je me demandais si vous pouvez dire que moins le code contient de chiffres, plus il est rapide si vous utilisez:la même commande, par exemple
STRING=abc.def echo ${STRING} | sed 's/.def//g' echo ${STRING} | sed '$s/....$//'
différentes commandes, par exemple
STRING=abc.def echo ${STRING} | cut -d . -f 1 echo ${STRING} | sed 's/.def//g'
shell-script
Vincent
la source
la source
Réponses:
Les shells ne réorganisent pas le code qu'ils reçoivent, il est simplement interprété ligne par ligne (rien d'autre n'a beaucoup de sens dans un interpréteur de commandes). Une grande partie du temps passé par le shell est consacrée à l'analyse / l'analyse syntaxique / le lancement des programmes appelés.
Pour les opérations simples (comme celles qui montent des chaînes dans les exemples à la fin de la question), je serais surpris si le temps de chargement des programmes ne submerge aucune minuscule différence de vitesse.
La morale de l'histoire est que si vous avez vraiment besoin de plus de vitesse, il vaut mieux utiliser un langage (semi) compilé comme Perl ou Python, qui est plus rapide à exécuter pour commencer, dans lequel vous pouvez écrire de nombreuses opérations mentionnées directement et ne pas avoir à appeler des programmes externes, et a la possibilité d'appeler des programmes externes ou d'appeler dans des modules C optimisés (ou quoi que ce soit) pour faire une grande partie du travail. C'est la raison pour laquelle dans Fedora le "sucre d'administration système" (GUI, essentiellement) est écrit en Python: peut ajouter une interface graphique agréable sans trop d'effort, assez rapide pour de telles applications, avoir un accès direct aux appels système. Si ce n'est pas assez de vitesse, prenez C ++ ou C.
Mais n'y allez pas , sauf si vous pouvez prouver que le gain de performances vaut la perte de flexibilité et de temps de développement. Les scripts shell ne sont pas trop mauvais à lire, mais je frémis quand je me souviens de certains scripts utilisés pour installer Ultrix que j'ai essayé de déchiffrer. J'ai abandonné, trop d '"optimisation du script shell" avait été appliquée.
la source
La première règle d'optimisation est: ne pas optimiser . Testez d'abord. Si les tests montrent que votre programme est trop lent, recherchez les optimisations possibles.
La seule façon d'être sûr est de comparer votre cas d'utilisation. Il existe des règles générales, mais elles ne s'appliquent qu'aux volumes de données typiques dans les applications typiques.
Quelques règles générales qui peuvent ou non être vraies dans une circonstance particulière:
echo $foo
est plus lent queecho "$foo"
, car sans guillemets, il se divise$foo
en mots et interprète chaque mot comme un motif générique de nom de fichier. Plus important encore, ce comportement de division et de globulation est rarement souhaité. N'oubliez donc pas de toujours mettre des guillemets autour des substitutions de variables et des substitutions de commandes:"$foo"
,"$(foo)"
.cut
ouhead
peuvent être émulés avecsed
, maissed
seront plus lents etawk
seront encore plus lents. Le traitement des chaînes de shell est lent, mais pour les chaînes courtes, il bat largement l'appel d'un programme externe.Il est rare que les performances soient un problème dans les scripts shell. La liste ci-dessus est purement indicative; il est parfaitement possible d'utiliser des méthodes «lentes» dans la plupart des cas, car la différence est souvent d'une fraction de pour cent.
Habituellement, le but d'un script shell est de faire quelque chose rapidement. Vous devez gagner beaucoup à l'optimisation pour justifier de passer des minutes supplémentaires à écrire le script.
la source
python
etruby
sont certainement plus lents à démarrer, au moins sur mon système, ilperl
est aussi rapide à démarrer quebash
ouksh
. GNU awk est beaucoup plus lent que GNU sed, en particulier dans les locales utf-8, mais ce n'est pas le cas pour tous les awks et tous les seds. le ksh93> dash> pdksh> zsh> bash n'est pas toujours aussi clair que ça. Certains obus sont meilleurs à certains égards que d'autres, et le gagnant n'est pas toujours le même.Volé à partir d' erreurs courantes de script shell par Pádraig Brady.
la source
for i in *; do wc -l "$i">/dev/null; done
mieux fairefor i in *; do wc -l "$i"; done>/dev/null
.time
cmdwc -l
, vérifiez que j'ai mis à jour en poste votre sortie