Estaba escribiendo un analizador de archivos en Perl, así que tuve que recorrer el archivo. El archivo consta de registros de longitud fija y quería crear una función separada que analiza el registro dado y llama a esa función en un bucle. Sin embargo, el resultado final resultó ser lento con archivos grandes y creo que no debería usar la función externa. Así que hice algunas pruebas simuladas con y sin llamada de función en un bucle:¿por qué las llamadas a funciones en bucles Perl son tan lentas?
[A]
foreach (1 .. 10000000) {
$a = &get_string();
}
sub get_string {
return sprintf("%s\n", 'abc');
}
[B]
foreach (1 .. 10000000) {
$a = sprintf "%s\n", 'abc';
}
medición mostró que un código se ejecuta alrededor de 3-4 veces más lento que el código B. Sabía de antemano que el código A se suponía que debía correr más lento, pero aún así me sorprendió que la diferencia fuera tan grande. También intenté ejecutar pruebas similares con Python y Java. En el código de Python, un equivalente era aproximadamente un 20% más lento que B y el código de Java corría más o menos a la misma velocidad (como se esperaba). Cambiar la función de sprintf a otra cosa no mostró ninguna diferencia significativa.
¿Hay alguna manera de ayudar a Perl a ejecutar esos bucles más rápido? ¿Estoy haciendo algo totalmente incorrecto aquí o es la característica de Perl que las llamadas a funciones son tales?
lo que, precisamente, no get_string() hacer? – eruciform
@roe Estamos suponiendo que es un stub y no usaste 'sprintf' solo para pegar una nueva línea en una cadena constante. Eso sería tonto. Entonces, ¿qué es lo que realmente hace? – Schwern
raro, mi pantalla formateada extrañamente, no estaba allí antes. firefox goof .. – eruciform