Je me demandais quel est le moyen le plus rapide d'exécuter un script, j'ai lu qu'il y avait une différence de vitesse entre afficher la sortie du script sur le terminal, le rediriger vers un fichier ou peut-être /dev/null
.
Donc, si la sortie n'est pas importante, quel est le moyen le plus rapide de faire fonctionner le script plus rapidement, même s'il est minimal.
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Réponses:
De nos jours, les terminaux sont plus lents qu'auparavant, principalement parce que les cartes graphiques ne se soucient plus de l'accélération 2D. Ainsi, en effet, l'impression sur un terminal peut ralentir un script, en particulier lorsque le défilement est impliqué.
Par conséquent,
./script.sh
est plus lent que./script.sh >script.log
, ce qui à son tour est plus lent que/script.sh >/dev/null
, car ces derniers impliquent moins de travail. Cependant, la question de savoir si cela fait suffisamment de différence pour un usage pratique dépend de la quantité de sortie produite par votre script et de la vitesse. Si votre script écrit 3 lignes et se ferme, ou s'il imprime 3 pages toutes les quelques heures, vous n'avez probablement pas à vous soucier des redirections.Edit: Quelques repères rapides (et complètement cassés):
Dans une console Linux, 240x75:
Dans un
xterm
, 260x78:Rediriger vers un fichier, sur un disque Samsung SSD 850 PRO 512 Go:
Rediriger vers
/dev/null
:la source
timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"
imprime plus de 100000 lignes en une seconde sur mon MBP.)xterm
s sur HP Apollo d'il y a 30 ans utilisé pour ramper par rapport àxterms
HP-UX d'il y a 20 ans. Cependant, une console Linux avec une carte vidéo Matrox d'il y a 15 ans était plus lente que la même console Linux avec une carte S3 d'il y a 20 ans. Et une console Linux avec un tampon de trame haute résolution sur une carte moderne est tout simplement inutilisable. :)J'aurais instinctivement accepté la réponse de Satō Katsura; Ca a du sens. Cependant, c'est assez facile à tester.
J'ai testé l'écriture d'un million de lignes à l'écran, l'écriture (ajout) dans un fichier et la redirection vers
/dev/null
. J'ai testé chacun d'eux tour à tour, puis j'ai fait cinq répétitions. Ce sont les commandes que j'ai utilisées.J'ai ensuite tracé le total des temps ci-dessous.
Comme vous pouvez le voir, les présomptions de Satō Katsura étaient correctes. Selon la réponse de Satō Katsura, je doute également que le facteur limitant soit la sortie, il est donc peu probable que le choix de la sortie ait un effet substantiel sur la vitesse globale du script.
FWIW, ma réponse d'origine avait un code différent, qui avait le fichier ajouté et
/dev/null
redirigé à l' intérieur de la boucle.Comme le souligne John Kugelman dans les commentaires, cela ajoute beaucoup de frais généraux. La question actuelle, ce n'est pas vraiment la bonne façon de le tester, mais je vais le laisser ici car il montre clairement le coût de la réouverture d' un fichier à plusieurs reprises à partir de l' intérieur du script lui - même.
Dans ce cas, les résultats sont inversés.
la source
xterm
, ce qui est à son tour ~ 3 fois plus lent que/dev/null
.Une autre façon d'accélérer un script est d'utiliser un interpréteur de shell plus rapide. Comparez les vitesses d'une boucle occupée POSIX , exécutée sous
bash
v4.4 ,ksh
v93u + 20120801 etdash
v0.5.8 .bash
:Sortie:
ksh
:Sortie:
dash
:Sortie:
Un sous - ensemble de commandes dans
bash
etksh
sont rétrocompatibles avec toutes les commandes dansdash
. Unbash
script qui utilise uniquement des commandes dans ce sous-ensemble devrait fonctionner avecdash
.Certains
bash
scripts qui utilisent de nouvelles fonctionnalités peuvent être convertis en un autre interpréteur. Si lebash
script s'appuie fortement sur des fonctionnalités plus récentes, cela ne vaut peut-être pas la peine - certaines nouvellesbash
fonctionnalités sont des améliorations qui sont à la fois plus faciles à coder et plus efficaces, (bienbash
qu'elles soient généralement plus lentes), de sorte que l'dash
équivalent (qui pourrait impliquer l'exécution plusieurs autres commandes), serait plus lent.En cas de doute, lancez un test ...
la source