LINUX.ORG.RU
ФорумTalks

Бенчмарк объектный Фибоначчи. Часть 3-я.

 , , ,


0

3

Хотел закинуть заметку, когда тестов будет побольше, но пятница… В общем, я затеял третью реинкарнацию теста на производительность разных объектных языков.

На этот раз всё цивильно, на GitHub и с результатами в Wiki: https://github.com/Balancer/benchmarks-fib-obj

Предыстория вопроса — http://www.balancer.ru/tech/forum/2008/08/t63003--proizvoditelnost-yazykov-ob...

Для sqrt(Ъ) ссылка сразу на первую часть результатов: https://github.com/Balancer/benchmarks-fib-obj/wiki/Результат-теста:-i3-2.2ГГц

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

sqrt(Ъ)

Корень квадратный от Ъ? Что-то новенькое :)

pekmop1024 ★★★★★
()

весёлым пятничным взглядом подиагонали - тесты несовсем корректны. В некоторых случаях (без gc, тот-же с++ сливший d) в измерения входили пообъектные деструкторы/финализеры, в некоторых нет.

MKuznetsov ★★★★★
()

Объекты не нужны, только ФП, только хас хардкор.

PolarFox ★★★★★
()

Это тест на скорость создания новых объектов или на скорость расчёта фибоначчи?

Если второе, то, например, в окамле (другие тесты пока не смотрел) используется вспомогательная функция-аккумулятор для хвостовой рекурсии. Иначе не дожидаясь результата можно сказать, что будет тормозить :)

barti_ddu
()

А; ясно, прочитал-таки ридми; вопрос снимается :)

barti_ddu
()

Добавь еще тест для случая C++ heap tcmalloc.

g++ -O3 heap.cpp -l tcmalloc_minimal

У меня получилась на этой задаче разница в 25%.

x_hash
()
Ответ на: комментарий от grim

или как в прошлом тесте - неудобные варианты не принимаются?

Это какие? Я помню только пару случаев, когда предлагался не объектный тест.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от AX

тут товарищ просит добавить тестик для Go

Добавил. Вышло 0.888 (при чём очень стабильно).

Только тестить надо на Go 1.1.2

Нашёл PPA только максимум с 1.1.1 (а «родной» под Raring, вообще 1.0.x), но результат корректный получился.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от x_hash

g++ -O3 heap.cpp -l tcmalloc_minimal
У меня получилась на этой задаче разница в 25%.

Поставил libtcmalloc-minimal4

Но G++ почему-то собирать отказывается:

/usr/bin/ld: cannot find -ltcmalloc_minimal
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от GanGSISoft

версия руби старая

Зато основная :) Пока ломать систему версией 2.0 не хочется, тем более, что результат, судя по всему, сильно не изменится и на общую расстановку никак не повлияет.

Или он под Ubuntu есть в виде отдельного пакета, не ломающего остальные зависимости?

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от barti_ddu

Если второе, то, например, в окамле (другие тесты пока не смотрел) используется вспомогательная функция-аккумулятор для хвостовой рекурсии.

Можно ещё быстрее, за логарифмическое время.

mix_mix ★★★★★
()
Ответ на: комментарий от GanGSISoft

node.js ли мб это http://phantomjs.org/

А, я так понял, что вопрос именно о Fan под .NET/JS.

Если речь о платформах, то C# добавил.

Но какая-то ерунда как со временем работы (вышло медленнее, чем на тесте 5-летней давности на куда более тормозной машине, так и со временем вычисления — оно в колеблется около 15.5..17.0 сек, в то же время, как были выбросы в 14 и 12.3 сек.

Судя по всему, 5 лет назад я бинарник собирал компилятором от MS (msc — это ж оно?) и, видимо, он много эффективнее, чем gmcs. Или я не допёр, что там кроме --optimize+ можно указать.

Надо будет попробовать под Windows тест собрать.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

Можно ещё быстрее, за логарифмическое время.

Можно за фиксированное время — через гамма-функцию :)

(каждый раз эта тема поднимается…)

KRoN73 ★★★★★
() автор топика

Да, кстати (копипаст с форуме).

За прошедшие годы есть интересные изменения.

— Java и Scala стали быстрее. Уже не в 5 раз медленнее, чем С++ с объектами на стеке, а только вдвое.

— Scala сравнялась по скорости с Java, догнал их и Fantom

— Ruby ещё прибавил в скорости, от C++ с кучей отстаёт не в 13-18 раз, а в 8.

— Ruby уверенно обошёл Python.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

Каким образом, простите?

По формуле Бине. Правда, пардон, фиксированного времени там не будет. Всё равно возведение в степень считать придётся. Так что для больших N, наверное, логарифмическое время и получится.

KRoN73 ★★★★★
() автор топика

JRuby сделал офигенный скачок. Он теперь работает быстрее оригинального Ruby (даже с прогнозом для 2.0.0 на моей машине). А раньше был неимоверным тормозом, уступающим только PHP.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

По формуле Бине. Правда, пардон, фиксированного времени там не будет.

Угу, только там и гамма-функция ровно так же не причём.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Угу, только там и гамма-функция ровно так же не причём.

Да, точно. 90° — это прямой угол. Там золотое сечение фигурирует :) А у меня в голове оно причудливо отложилось в вычисление гамма-функции.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Надо будет попробовать под Windows тест собрать.

Собрал. Нифига не изменилось. Судя по всему, это у mono такая деградация сильная.

KRoN73 ★★★★★
() автор топика

эмм ....
http://ru.wikipedia.org/wiki/Числа_Фибоначчи

http://oeis.org/A000045

Fibonacci numbers: F(n) = F(n-1) + F(n-2)
и это просто закодировано в лобешник как целые числа номеров мест, а не их значения ...
мало того, на представление чисел:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169
отводится int
...
no comment ...

bedcasus
()

C++11:

~$ cat 1.cpp
#include <stdio.h>

class Fib
{
     int _value;

  public:
    constexpr Fib(int n) : _value( n ) {}

    constexpr int value() const
    {
        return _value <= 2 ?
            1 :
            Fib(_value - 1).value() + Fib(_value - 2).value();
    }
};

int main()
{
    for(int i=0; i<10; i++)
    {
        constexpr int value = Fib(40).value();

        printf("n=%d\n", value);
    }
}
~$ g++ -std=c++11 -Ofast 1.cpp
~$ time ./a.out 
n=102334155
n=102334155
n=102334155
n=102334155
n=102334155
n=102334155
n=102334155
n=102334155
n=102334155
n=102334155

real	0m0.001s
user	0m0.000s
sys	0m0.001s

ну и даже те варианты, что есть, стоит пересобрать с -Ofast, а не -O3

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)

на моём q6600 на 1600Mhz

c++ stack - 0m5.730s
c++ boost - 0m14.544s
c++ heap  - 0m31.013s
perl(5.18) Can't return outside a subroutine at fib_perl.pm line 31.
python3  - 6m30.552s
и внимание: C++11: - 0m0.003s
hope13 ★★★
()
Ответ на: комментарий от bedcasus

меряют производительность ОП, задача хоть и не самая удачная выбрана, но зато под нее есть уже решения на разных ЯП, лучше чем ничего

wota ★★
()
Ответ на: комментарий от wota

хм ...
нет понятухи в постановке алгоритмов
и размерности промежуточных значений, но зато, вах, какой ооп ... и все что- считают не в зуб ногой в смысле всего действа ...
смешно же ))

bedcasus
()
Ответ на: комментарий от bedcasus

ну смейся в сторонке, никто не запрещает

wota ★★
()
Ответ на: комментарий от bedcasus

и все что- считают

--> и все что-то там считают себе ...

bedcasus
()
~$ time g++ -std=c++11 -Ofast 1.cpp

real	0m0.040s
user	0m0.039s
sys	0m0.002s
~$ time gdc -Ofast a.d

real	0m0.981s
user	0m0.932s
sys	0m0.047s

LOL, а Александреску распинался, как у него программы на D быстро собираются, и да - в варианте на С++ еще и все посчиталось в compile time, а в варианте на D - нет :(, хотя опять же - тут на ЛОР распинались какой D умный, умеет сам CTE, без всяких хинтов

wota ★★
()
Ответ на: комментарий от wota
~$ time g++ -std=c++11 -O0 1.cpp

real	0m0.044s
user	0m0.028s
sys	0m0.017s
~$ time gdc -O0 a.d

real	0m0.398s
user	0m0.359s
sys	0m0.039s

без оптимизации, если кому надо

wota ★★
()
Ответ на: комментарий от record

fpc (free pascal compiler) не хватает

Пример давайте. А то я на Паскале никогда с объектами не работал. И, вообще, последнюю программу на нём писал 22 года назад.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от bitick

PyPy бы затестить...

Добавил. Офигенно :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от iSage

xdebug
*facepalm*

Жесть. А раньше он при выключенном профилировании на скорость не влиял. Обновил результаты теста.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от no-dashi

И «голого» Mono/C#

Этот ещё ночью добавлял. Только результаты странные. Походу, mono за прошедшие 5 лет сильно деградировал по скорости.

KRoN73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.