Производительность ruby
13 февраля 2007
В минувшую субботу, на rupy 2007 возникло небольшое обсуждение с Андреем Таранцевым по поводу скорости вычисления числа из ряда фибоначи в ruby/jruby, что было одним из тестов производительности языков. Проблема возникла в том что последний очень медленно считал, в сотни и тысячи раз медленней java. JRuby вычисляет 40 элемент за 26 минут, а java 1,7 секунды. Python тоже не быстр, но ближе к java.
Андрей предположил что это связано с тем что язык динамический, все можно переопределять, и т.д., поэтому мат. операции такие медленные. Я вот проверил, у меня возникло подозрение что вина в рекурсии, посчитал время вычисления для разных языков:

Если тоже самое вычислять итеративным алгоритмом, то время резко падает и остаётся в районе миллисекунд, без особого видимого роста, по крайней мере на таком объеме. Я знал что рекурсия это не очень быстро, но честно говоря никогда не замерял насколько, и очень удивлён что такое огромное влияние.
Вот такое вот разочарование
Если на чистоту то и java тоже не любит часто любимую мной рекурсию, даже такую простую, т.к. тоже не имеет tail call optimization, и даже в любой момент может упасть по OutOfMemoryException из-за рекурсии, я уже спотыкался на этом когда то.
PS: на самом деле для ruby, а точнее Ruby on Rails, все это насчёт рекурсии совсем неважно, но иметь ввиду все же надо.

февраля 13, 2007 в 16:04
Ну да, у него с такими вещами проблемы, ну так им для подобных вещей и не пользуются.
февраля 20, 2007 в 22:41
Неплохо бы ваш рекурсивный алгоритм погонять на:
* Python (aka CPython) + Psyco
* Stackless Python
* IronPython
марта 6, 2007 в 08:12
[...] Чел провел некоторые опыты на тему скорости работы рекурсии: 2view: www.artamonov.ru/2007/02/13/ruby-perfomance/ Картинка: 5 27 [...]
марта 10, 2007 в 14:36
Вряд ли при использовании рекурсии будет OutOfMemoryError, скорее — StackOverflowError.
марта 11, 2007 в 06:28
Да, наверное, как именно падало уже и не помню, и написал не задумываясь.
апреля 5, 2007 в 21:45
посмотрел запись твоего доклада с RuPyRu, зря упустил инфу про Ruby-плагин для NetBeans 6 — там вроде щас очень бодро всё развивается: blogs.sun.com/tor/
апреля 6, 2007 в 08:40
Да я както NetBeans вообще пропустил. Все больше IDEA и Eclipse.
Хотя говорят что нетбинс очень даже ничего стал.
марта 19, 2008 в 12:59
Числа Фибоначчи можнро вычислять за экспоненциальное время, за линейное, за логарифмическое и за константное, на выбор
. В случае тупого f (a) = f (a-1)+f (a-2) мы просто меряем накладные расходы на вызовы функций. Кстати, эта тупая формула не является tail call, нужно использовать аккумулятор, тогда компилер сожет соптимизировать (С-ный например). А Java tail call optimization не умеет, это да.