Производительность ruby

В минувшую субботу, на rupy 2007 возникло небольшое обсуждение с Андреем Таранцевым по поводу скорости вычисления числа из ряда фибоначи в ruby/jruby, что было одним из тестов производительности языков. Проблема возникла в том что последний очень медленно считал, в сотни и тысячи раз медленней java. JRuby вычисляет 40 элемент за 26 минут, а java 1,7 секунды. Python тоже не быстр, но ближе к java.
Андрей предположил что это связано с тем что язык динамический, все можно переопределять, и т.д., поэтому мат. операции такие медленные. Я вот проверил, у меня возникло подозрение что вина в рекурсии, посчитал время вычисления для разных языков:
Ruby Recursion Benchmark
Если тоже самое вычислять итеративным алгоритмом, то время резко падает и остаётся в районе миллисекунд, без особого видимого роста, по крайней мере на таком объеме. Я знал что рекурсия это не очень быстро, но честно говоря никогда не замерял насколько, и очень удивлён что такое огромное влияние.
Вот такое вот разочарование 🙁 Если на чистоту то и java тоже не любит часто любимую мной рекурсию, даже такую простую, т.к. тоже не имеет tail call optimization, и даже в любой момент может упасть по OutOfMemoryException из-за рекурсии, я уже спотыкался на этом когда то.

PS: на самом деле для ruby, а точнее Ruby on Rails, все это насчёт рекурсии совсем неважно, но иметь ввиду все же надо.

  • http:// Макс Лапшин

    Ну да, у него с такими вещами проблемы, ну так им для подобных вещей и не пользуются.

  • http:// me

    Неплохо бы ваш рекурсивный алгоритм погонять на:

    * Python (aka CPython) + Psyco

    * Stackless Python

    * IronPython

  • Pingback: a Z3Labs.com 1 16 » Blog Archive 1 2e » Perfomance: java, ruby, jruby, python 36

  • http:// c0nst

    Вряд ли при использовании рекурсии будет OutOfMemoryError, скорее — StackOverflowError.

  • http:// igor

    Да, наверное, как именно падало уже и не помню, и написал не задумываясь.

  • http:// Ivan Tarasov

    посмотрел запись твоего доклада с RuPyRu, зря упустил инфу про Ruby-плагин для NetBeans 6 — там вроде щас очень бодро всё развивается: blogs.sun.com/tor/

  • http:// igor

    Да я както NetBeans вообще пропустил. Все больше IDEA и Eclipse.

    Хотя говорят что нетбинс очень даже ничего стал.

  • http:// k.kastaneda

    Числа Фибоначчи можнро вычислять за экспоненциальное время, за линейное, за логарифмическое и за константное, на выбор :). В случае тупого f (a) = f (a-1)+f (a-2) мы просто меряем накладные расходы на вызовы функций. Кстати, эта тупая формула не является tail call, нужно использовать аккумулятор, тогда компилер сожет соптимизировать (С-ный например). А Java tail call optimization не умеет, это да.