Я проводил несколько экспериментов, и вот что я нашел.Рассмотрим следующую программу на 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 раз (и это, вероятно, с выполненной оптимизацией хвостовой рекурсии).