Pull to refresh

Ruby && Python && Perl && PHP && Ruby1.9

Reading time 3 min
Views 14K
В коментариях к моей статье были высказанны просьбы протестировать производительность приведенного там примера на других языках. Что я и пытался сделать.
Как видно из заголовка, в тесте участвовали практически все популярные сегодня динамические языки, а также новая версия Ruby.
Давайте взглянем на результаты.

Пару слов о тесте. Для тестирования была использованна функция факторизации числа. Алгоритм самый примитивный — перебор делителей. В каждом языке был создан класс(кроме Perl'a) с одним методом.
Затем он 1000 раз вызывался в цикле, с аргументом равным 999999.
Система на которой производилось испытание — Debian Lenny. Все интерпретаоры установленны пакетами из официального репозитария. Процессор — Pentium D 2.8.
В тесте также участвовал интерпретатор Ruby из эксперементальной ветки 1.9(так же поставленный из репозитария).
Еще замечание, возможно некоторые скрипты я реализовал неоптимально, учитывая возможности языков. Я старался реализовать алгоритм идентично во всех языках. Если есть замечания и дополнения — пожалуйста в коментарии.
Для теста был написан такой скрипт:
    #!/bin/bash
    uname -a #информация о системе
    cat /proc/cpuinfo | grep "model name" #информация о процессоре
    #сами тесты, с предворительным выводом версии интерпретатора
    ruby -v
    time ruby factor.rb
    ruby1.9 -v
    time ruby1.9 factor.rb
    php -v
    time php factor.php
    python -V
    time python factor.py
    perl -v
    time perl factor.pl

Теперь посмотрим на результат выполнения этого скрипта:
    Linux debian 2.6.26-1-686 #1 SMP Mon Dec 15 18:15:07 UTC 2008 i686 GNU/Linux
    model name	: Intel(R) Pentium(R) D CPU 2.80GHz
    model name	: Intel(R) Pentium(R) D CPU 2.80GHz
    ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]

    real	0m1.099s
    user	0m1.076s
    sys	0m0.000s
    ruby 1.9.0 (2008-06-20 revision 17482) [i486-linux]

    real	0m0.287s
    user	0m0.252s
    sys	0m0.008s
    PHP 5.2.6-0.1~lenny1 with Suhosin-Patch 0.9.6.2 (cli) (built: Nov 29 2008 21:35:12) 
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

    real	0m0.348s
    user	0m0.324s
    sys	0m0.008s
    Python 2.5.2

    real	0m0.537s
    user	0m0.536s
    sys	0m0.000s

    This is perl, v5.10.0 built for i486-linux-gnu-thread-multi

    Copyright 1987-2007, Larry Wall

    Perl may be copied only under the terms of either the Artistic License or the
    GNU General Public License, which may be found in the Perl 5 source kit.

    Complete documentation for Perl, including FAQ lists, should be found on
    this system using "man perl" or "perldoc perl".  If you have access to the
    Internet, point your browser at http://www.perl.org/, the Perl Home Page.


    real	0m0.569s
    user	0m0.552s
    sys	0m0.004s


Подведем итог. Python примерно соизмерим по скорости с Perl. Ruby 1.8 естественно проигрывает. PHP почти быстрее всех.
И тут такая неожиданность, эксперементальная ветка Ruby 1.9 оказывается быстрее всех. Я не случайно включил в тестирование Ruby 1.9. При его разработке упор ставился на скорость. Но я, чесно говоря, очень удивлен, не ожидал что настолько хорошо получится.
Так что поклонники Ruby, нам есть куда стремиться. Ждем Ruby 2.0!:)

Скрипты использованные в тесте:
factor.rb, factor.py, factor.pl, factor.php

Upd: В коментариях разгорелся спор об объективности результатов. Да, я не спорю, тест синтетический, к тому же провести комплексный анализ производительности цели не было.
Результатами можно считать следующее:
1. Скорость выполнения на этих языках соизмерима(по крайней мере очень значительных скачков на этой задаче нет).
2. Ruby(этот бенчмарк по мотивам статьи о Ruby) успешно развивается в плане производительности.
Upd2: Хабраюзер deerua для наглядности сделал диаграму, на которой отображены результаты тестов:
benchmark
Upd3: Хабраюзер AlDev не остался в стороне, и сделал другую версию диаграмы:
bencmark
Tags:
Hubs:
+30
Comments 221
Comments Comments 221

Articles