Erstens ein Nitpick: Ein String wie a*
in der normalen Shell-Syntax ist ein Glob, der anders funktioniert als reguläre Ausdrücke.
In einer allgemeinen Übersicht erweitert der Shell-Interpreter (dh Bash) die Zeichenfolge a*
zu einer Liste aller Dateinamen, die dem Muster entsprechen a*
. Diese werden dann Teil der Befehlszeilenparameter für eine einzelne Instanz von grep
(für die Programmierer werden alle erweiterten Wörter als separate Zeichenfolgen in das argv
Argument von eingefügt main
). Dieser einzelne grep
Befehl analysiert dann die Argumente auf die von ihm gewählte Weise, und es liegt an grep
diesen Argumenten, sie als Dateinamen, Optionen, Optionsargumente, reguläre Ausdrücke usw. zu interpretieren und die entsprechenden Maßnahmen zu ergreifen. Alles erfolgt nacheinander (AFAIK keine grep
Implementierung verwendet mehrere Threads).
Wenn Sie eine Schleife in einem Shell-Skript implementieren, um dasselbe zu tun, ist sie aus den folgenden Gründen fast garantiert langsamer als der oben beschriebene Prozess. Wenn Sie für jede Datei einen neuen Grep-Prozess erzeugen, wird dieser mit Sicherheit langsamer, da der Aufwand für die Prozesserstellung unnötig multipliziert wird. Wenn Sie die Argumentliste selbst im Shell-Skript erstellt und eine einzelne Instanz von verwendet haben grep
, ist alles, was Sie in der Shell tun, immer noch langsamer, da Shell-Befehle (per Bash) interpretiert werden müssen, wodurch eine zusätzliche Codeebene hinzugefügt wird Implementieren Sie einfach neu, was bash intern bereits in kompiliertem Code schneller gemacht hat.
Wenn Sie es selbst in C schreiben, können Sie wahrscheinlich leicht eine vergleichbare Leistung wie im ersten Absatz beschrieben erzielen, aber es ist unwahrscheinlich, dass Sie einen ausreichenden Leistungsgewinn gegenüber den aktuellen Grep / Bash-Implementierungen erzielen können, um die Zeit zu rechtfertigen ausgegeben, ohne sich mit maschinenspezifischen Leistungsoptimierungen zu befassen oder die Portabilität zu beeinträchtigen. Vielleicht könnten Sie versuchen, eine willkürlich parallelisierbare Version von zu entwickeln grep
, aber selbst das hilft möglicherweise nicht, da Sie eher an E / A als an CPU gebunden sind. Glob Expansion und Grep sind für die meisten "normalen" Zwecke bereits "schnell genug".
glob
kein regulärer Ausdruck. Großer Unterschied.