He estado haciendo algunos experimentos y aquí hay algo que encontré. Considere el siguiente programa en C:Haskell - equivalente eficiente de for loop?
int main()
{
for(int i = 0;
i < 1000000;
++i)
{}
}
y el siguiente programa Haskell:
import System.IO
loop :: Int -> IO()
loop n = if 0 == n then return() else loop (n-1)
main = loop 1000000
Aquí está la salida de time
para el programa C por encima de:
real 0m0.003s
user 0m0.000s
sys 0m0.000s
... y para el programa Haskell:
real 0m0.028s
user 0m0.027s
sys 0m0.000s
Al principio pensé que gcc detectó un bucle vacío y lo optimizó, pero después de aumentar el número de iteraciones, el tiempo de ejecución del programa también aumentó. Aquí están las salidas de time
tanto de los programas, con el número de iteraciones fijados a 10000000:
versión C
real 0m0.024s
user 0m0.023s
sys 0m0.000s
versión Haskell
real 0m0.245s
user 0m0.247s
sys 0m0.000s
Como se puede ver, el Haskell el programa es 10 veces más lento.
Pregunta es: ¿cuál es la alternativa eficiente al lazo for
en Haskell? Como acabamos de ver, la recursión simple ralentiza el programa unas 10 veces (y esto es probablemente con las optimizaciones de recursión de cola hechas).
Por curiosidad, ¿el código de montaje producido a partir del programa de C optimizado completamente eliminar el bucle? – shuttle87
Pfft, el bucle 'while'. Duh. : P –
@ shuttle87 con -O3 marca el ciclo se elimina por completo, sin él no lo hace. –