Tout d'abord, un nitpick: une chaîne comme a*
dans la syntaxe shell normale est un glob, qui fonctionne différemment des expressions régulières.
Sur une vue d'ensemble de haut niveau, l'interpréteur de shell (c'est-à-dire bash) développe la chaîne a*
en une liste de chaque nom de fichier correspondant au modèle a*
. Celles-ci font alors partie des paramètres de ligne de commande d'une seule instance de grep
(pour les programmeurs, tous les mots développés vont comme des chaînes distinctes dans l' argv
argument de main
). Cette grep
commande unique analyse ensuite les arguments de la manière qu'elle choisit, et c'est grep
à interpréter ces arguments comme des noms de fichiers, des options, des arguments d'options, des expressions régulières, etc., et de prendre les actions appropriées. Tout se passe séquentiellement (aucune grep
implémentation AFAIK n'utilise plusieurs threads).
Si vous implémentez une boucle dans un script shell pour faire la même chose, il est presque garanti d'être plus lent que le processus ci-dessus, pour les raisons suivantes. Si vous générez un nouveau processus grep pour chaque fichier, il sera très certainement plus lent en raison de la multiplication inutile des frais généraux de création de processus. Si vous avez construit vous-même la liste des arguments dans le script shell et utilisé une seule instance de grep
, tout ce que vous faites dans le shell sera encore plus lent car les commandes shell doivent être interprétées (par bash), ce qui ajoute une couche supplémentaire de code, et vous aurez juste réimplémenter ce que bash faisait déjà plus rapidement en interne dans le code compilé.
Quant à l'écrire vous-même en C, vous pouvez probablement facilement obtenir des performances comparables au processus décrit dans le premier paragraphe, mais il est peu probable que vous puissiez obtenir un gain de performances suffisant par rapport aux implémentations grep / bash actuelles pour justifier le temps dépensé sans plonger dans les optimisations de performances spécifiques à la machine ou sacrifier la portabilité. Vous pourriez peut-être essayer de proposer une version arbitrairement parallélisable de grep
, mais même cela peut ne pas aider car vous êtes plus susceptible d'être lié aux E / S que lié au CPU. L'expansion des globes et grep sont déjà "assez rapides" pour la plupart des utilisations "normales".
glob
pas une expression régulière. Grande différence.