2010-04-24 12 views
6

Escribí varios guiones en Perl y Shell y comparé el tiempo de ejecución real. En todos los casos, el script de Perl fue más de 10 veces más rápido que el script de shell.¿Es posible escribir un script de shell que sea más rápido que el script equivalente en Perl?

Entonces, me preguntaba si es posible escribir un script de shell que sea más rápido que el mismo script en Perl? ¿Y por qué Perl es más rápido que el shell aunque utilizo la función system en el script Perl?

+1

No lo sé. Pero probablemente depende del guión. publicar un ejemplo de script es algo bueno. también sin ser 100% la función del sistema en perl, probablemente se refiere a la biblioteca C. – xenoterracide

+0

¿Está pidiendo un ejemplo de un script de shell que sea más rápido que un script de Perl correspondiente? O bien, para cada script de Perl (al menos, cada script de Perl de un formulario específico), si es posible escribir un script de shell equivalente y más rápido. – outis

+0

un ejemplo de un script de shell que es más rápido que un script de Perl correspondiente :) – JohnJohnGa

Respuesta

6

Hay algunas formas de hacer que su shell (por ejemplo, Bash) se ejecute más rápido.

  1. Intente utilizar menos comandos externos si las partes internas de Bash pueden hacer la tarea para usted. Por ejemplo, uso excesivo de sed, grep, awk et para la manipulación de cadena/texto .
  2. Si está manipulando archivos relativamente GRANDES, no use bash's while read loop. Use awk. Si está manipulando archivos realmente GRANDES, puede usar grep para buscar los patrones que desee, y luego pasarlos a awk para "editar".El algoritmo de búsqueda de grep es muy bueno y rápido. Si desea obtener solo el frente o el final del archivo, use la cabeza y la cola.
  3. herramientas de manipulación de archivos como sed, cut, grep, wc, etc. todo se puede hacer con una secuencia de comandos awk o utilizando Bash internals si no es complicado. Por lo tanto, puede intentar reducir el uso de estas herramientas que se superponen en sus funciones. Unix tuberías/encadenamiento es excelente, pero el uso de muchos de ellos, por ejemplo command|grep|grep|cut|sed hace que su código sea lento. Cada tubería es una sobrecarga. Para este ejemplo, solo un awk los hace a todos. command | awk '{do everything here}' La herramienta más cercana que puede usar que puede coincidir con la velocidad de Perl para ciertas tareas, por ejemplo, la manipulación de cadenas o las matemáticas, es awk. Aquí hay un punto de referencia divertido para this solution. Hay alrededor de 9 millones de números en el archivo

salida

$ head -5 file 
1 
2 
3 
34 
42 
$ wc -l <file 
8999987 

# time perl -nle '$sum += $_ } END { print $sum' file 
290980117 

real 0m13.532s 
user 0m11.454s 
sys  0m0.624s 

$ time awk '{ sum += $1 } END { print sum }' file 
290980117 

real 0m9.271s 
user 0m7.754s 
sys  0m0.415s 

$ time perl -nle '$sum += $_ } END { print $sum' file 
290980117 

real 0m13.158s 
user 0m11.537s 
sys  0m0.586s 

$ time awk '{ sum += $1 } END { print sum }' file 
290980117 

real 0m9.028s 
user 0m7.627s 
sys  0m0.414s 

Para cada intento, awk es más rápido que Perl.

Por último, intenta aprender awk más allá de lo que pueden hacer como líneas.

+0

Gracias! eso es exactamente lo que estoy buscando! – JohnJohnGa

1

No, creo que es imposible:
comando bash es verdaderamente el lenguaje interpeted, pero los programas de Perl son compilados a código de bytes antes de la ejecución

+1

Ok, entonces, ¿por qué las personas usan el script de Shell? porque no saben perl? :) – JohnJohnGa

+1

Porque es natural usar el shell de comandos para ejecutar comandos :) –

+4

@JohnJohnGa: Porque el tiempo de persona es más valioso que el tiempo de CPU. Si toma incluso 5 minutos más escribir una versión de Perl que ahorrará unos segundos por ejecución, entonces bash es probablemente la mejor opción. Personalmente, soy un gran fanático de Perl, pero cuando voy a automatizar una serie de comandos sin necesidad de control de flujo, lo haré con bash. –

-2

Sí. El código C va a ser más rápido que el código Perl para la misma cosa, por lo que un script que use un ejecutable compilado para hacer mucho trabajo será más rápido que un programa perl que haga lo mismo.

Por supuesto, el programa Perl podría reescribirse para usar el ejecutable, en cuyo caso probablemente sería más rápido otra vez.

+0

Eso podría ser cierto en algunos casos, pero recuerde que Perl es código C. Dependiendo del trabajo, es posible que no pueda vencer la infraestructura altamente optimizada de C de Perl. –

4

Esto podría caer peligrosamente al brazo-silla de optimización, pero aquí están algunas ideas que pueden racionalizar sus resultados:

  • Tenedor/exec: casi cualquier cosa útil que es realizado por un script de shell se realiza a través un shell-out, que está iniciando un nuevo shell y ejecutando el comando a como sed, awk, cat etc. Más a menudo que no, se ejecuta más de un proceso y los datos se mueven por conductos.

  • Estructuras de datos: las estructuras de datos de Perl son más sofisticadas que las de Bash o Csh. Esto generalmente obliga al programador a crearse con almacenamiento de datos. Esto puede tomar la forma de: estructuras de datos óptimos no

    • uso (arrays) en lugar de los hashes de datos
    • almacenar en forma textual (por ejemplo enteros como cadenas) que deben ser reinterpretados cada vez.
    • guarde los datos en un archivo y vuelva a analizarlos una y otra vez.
    • etc.
  • no optimizado aplicación: algunos constructo cáscara que no podría ser diseñado con optimización en mente, pero con la comodidad del usuario. Por ejemplo, tengo motivos para creer que la implementación bash de Expansión de parámetros en particular ${foo//search/replace} no es óptima en relación con la misma operación en sed. Esto normalmente no es un problema para las tareas diarias.

1

Ciertos comandos de shell pueden ejecutarse más rápido que Perl, en algunas situaciones. Una vez analicé una secuencia de comandos sed simple contra el equivalente en perl, y sed ganó. Pero cuando los requisitos se volvieron más complejos, la versión perl comenzó a ganarle a la versión sed. Entonces la respuesta es, depende. Pero por otras razones (simplicidad, mantenimiento, etc.) me inclinaría a hacer cosas en Perl de todos modos a menos que los requisitos sean muy simples, y espero que sigan así.

2

De acuerdo, sé que lo estoy pidiendo abriendo una lata de gusanos cerrada hace dos años, pero no estoy 100% satisfecho con ninguna de las respuestas.

La respuesta correcta es SÍ. Pero la mayoría de los nuevos codificadores seguirán yendo a Perl y Python y escribirán códigos que luchan poderosamente para ENVOLVER LLAMADAS A EJECUTABLES EXTERNOS porque carecen de la tutoría o experiencia requerida para saber cuándo usar qué herramientas.

El Korn Shell (ksh) tiene matemáticas integradas rápidas, y un motor de expresiones regulares totalmente capaz y veloz que, jadeando, puede manejar expresiones regulares tipo Perl. También tiene matrices asociativas. Incluso puede cargar bibliotecas .so externas. Y fue un producto terminado y maduro hace 10 años. Incluso está ya instalado en tu Mac.

Cuestiones relacionadas