Я делал несколько экспериментов, и вот что я нашел. Рассмотрим следующую программу C:
int main()
{
for(int i = 0;
i < 1000000;
++i)
{}
}
и следующую программу Haskell:
import System.IO
loop :: Int -> IO ()
loop n = if 0 == n then return () else loop (n-1)
main = loop 1000000
Вот вывод time
для вышеуказанной программы C:
real 0m0.003s
user 0m0.000s
sys 0m0.000s
... и для программы Haskell:
real 0m0.028s
user 0m0.027s
sys 0m0.000s
Сначала я думал, что gcc обнаружил пустой цикл и оптимизировал его, но после увеличения количества итераций время работы программы также увеличилось. Вот выходы time
для обеих программ, количество итераций которых равно 10000000:
C версия
real 0m0.024s
user 0m0.023s
sys 0m0.000s
версия Haskell
real 0m0.245s
user 0m0.247s
sys 0m0.000s
Как вы можете видеть, программа Haskell в 10 раз медленнее.
Вопрос: какова эффективная альтернатива циклу for
в Haskell? Как мы только что видели, простая рекурсия замедляет работу программы примерно в 10 раз (и это, вероятно, с помощью оптимизации хвостовой рекурсии).