Primero, un nitpick: una cadena como a*
en la sintaxis de shell normal es un glob, que funciona de manera diferente a las expresiones regulares.
En una descripción general de alto nivel, el intérprete de shell (es decir, bash) expande la cadena a*
a una lista de cada nombre de archivo que coincida con el patrón a*
. Estos luego se convierten en parte de los parámetros de la línea de comandos para una sola instancia de grep
(para los programadores, todas las palabras expandidas van como cadenas separadas en el argv
argumento de main
). Ese grep
comando único analiza los argumentos de la forma que elija, y depende de grep
interpretar esos argumentos como nombres de archivo, opciones, argumentos de opción, expresiones regulares, etc., y tomar las acciones apropiadas. Todo ocurre secuencialmente (AFAIK ninguna grep
implementación usa múltiples hilos).
Si implementa un bucle en un script de shell para hacer lo mismo, es casi seguro que será más lento que el proceso anterior, por las siguientes razones. Si genera un nuevo proceso grep para cada archivo, seguramente será más lento debido a la sobrecarga de la creación del proceso que se multiplica innecesariamente. Si construyó la lista de argumentos usted mismo en el script de shell y utilizó una sola instancia de grep
, todo lo que haga en shell seguirá siendo más lento porque los comandos de shell deben interpretarse (por bash), lo que agrega una capa adicional de código, y obtendrá simplemente vuelva a implementar lo que bash ya hacía más rápido internamente en el código compilado.
En cuanto a escribirlo usted mismo en C, probablemente pueda obtener fácilmente un rendimiento comparable al proceso descrito en el primer párrafo, pero es poco probable que pueda lograr una ganancia de rendimiento suficiente sobre las implementaciones grep / bash actuales para justificar el tiempo gastado sin profundizar en optimizaciones de rendimiento específicas de la máquina o sacrificar la portabilidad. Tal vez podría intentar crear una versión paralelizable arbitrariamente grep
, pero incluso eso puede no ayudar, ya que es más probable que esté vinculado a E / S que a CPU. La expansión global y el grep ya son "lo suficientemente rápidos" para la mayoría de los propósitos "normales".
glob
expresión regular. Gran diferencia.