9 нояб. 2010 г.

Perl и рекурсия: ура!

В прошлой заметке выяснилось, что в Python-е рекурсия работает медленнее, чем for-цикл, а тот, в свою очередь -- медленнее, чем while. С циклами все понятно, while всегда быстрее. Что же касается рекурсии, то мне стало любопытно: специфична ли ее низкая производительность для Python-а или это везде так. И я решил ту же задачку -- получение из десятичного числа градусов, минут и секунд -- на Perl-е. Правда, ограничившись двумя
функциями: рекурсивной и циклом-while. Было интересно, насколько сильно здесь рекурсия отстает от цикла.

Результат удивил: рекурсия оказалась эффективнее.



Benchmark: timing 1000000 iterations of Recursive, While-loop...
Recursive: 136.521 wallclock secs (119.61 usr + 0.64 sys = 120.25 CPU) @ 8316.01/s (n=1000000)
While-loop: 142.86 wallclock secs (123.91 usr + 0.66 sys = 124.57 CPU) @ 8027.61/s (n=1000000)



Получается, что на миллион вызовов рекурсивной функции понадобилось 136 секунд. На столько же вызовов нерекурсивной функции ушло 142 секунды. За секунду рекурсивная функция успела отработать примерно на 300 раз больше.
Разница невелика -- и этот факт радует, потому что как система Perl ведет себя предсказуемо. Я не хочу вникать в устройство интерпретатора каждый раз когда приходится задумываться о реализации какого-то алгоритма.

Вот скрипт целиком:


1 комментарий:

Анонимный комментирует...

Ну после того, как Гвидо решил от лямбды избавится, не удивительно что он и рекурсию недолюбливает :-).