В минувшую субботу, на 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, все это насчёт рекурсии совсем неважно, но иметь ввиду все же надо.

8 Комментариев на “Производительность ruby”

  1. Макс Лапшин сказал:

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

  2. me сказал:

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

    * Python (aka CPython) + Psyco

    * Stackless Python

    * IronPython

  3. a Z3Labs.com 1 16 » Blog Archive 1 2e » Perfomance: java, ruby, jruby, python 36 сказал:

    [...] Чел провел некоторые опыты на тему скорости работы рекурсии: 2view: www.artamonov.ru/2007/02/13/ruby-perfomance/ Картинка: 5 27 [...]

  4. c0nst сказал:

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

  5. igor сказал:

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

  6. Ivan Tarasov сказал:

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

  7. igor сказал:

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

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

  8. k.kastaneda сказал:

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

Оставьте свое мнение

XHTML: Вы можете использовать следующие html теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> Если в комментарии пишете XML то вместо "<" используйте "&lt;"

Благодарности, комментарии не по теме и пр. спам ссылками удаляется, к тому же автоматически, можете не стараться.