Фибоначчи на Node.JS и Erlang, рак и мрак

Oct 04, 2011 04:42

Ted Dziuba - известный тролль.

Пару дней назад в интернетах пробежала статья «Node.JS is Cancer», (по-русски на Хабре: http://habrahabr.ru/blogs/nodejs/129640/) в которой он какой-то пурги набросал на Node.JS, даже не смешно. Не смешно это потому, что там лажа какая-то, наброс ( Read more... )

erlang

Leave a comment

rainman_rocks October 4 2011, 11:59:14 UTC
Никогда не понимал зачем бенчмаркить заведомо неэффективный алгоритм.
Оценка боевых характеристик оружия по тому, насколько удобно из него стрелять себе в ногу?

Reply

lionet October 4 2011, 12:01:29 UTC
Реперные точки ещё никогда никому не мешали. Потому что если сравнивать более сложные системы - там чёрт ногу сломит из-за огромного количества переменных и выбранных путей реализации. Спорить о тестировании сложных систем можно до бесконечности.

С другой стороны, Erlang VM имеет репутацию медленного рантайма, и данный тест её пошатывает. По крайней мере, на первый прикид не хуже, чем хвалёный V8.

Reply

tzirechnoy October 4 2011, 13:49:08 UTC
С этим фиббоначи есть такая проблема: регулярно появляется оптимизатор, который автоматически преобразует алгоритм в эффективный. (Ну, один кэш значений разгоняет его в дохрена раз.) И вот смотришь ты на результат, и думаешь: ну и что? Я так и вручную где надо могу, у меня оно всё равно не сработает.

Reply

lionet October 4 2011, 16:14:55 UTC
На результаты данного теста это наблюдение не влияет.

Reply

tzirechnoy October 4 2011, 16:15:38 UTC
Типа свезло.

Reply

lionet October 4 2011, 16:23:45 UTC
Типа да.

Reply

rainman_rocks October 4 2011, 18:26:43 UTC
Это как в анекдоте: "ищу потерянные ключи под фонарём, потому что там светло".

Если нужна числодробилка - дык питонист просто возьмёт Cython и поимеет хорошую скорость:

rainman$ time python fibbo.py 39
102334155

real 0m25.837s
user 0m25.800s
sys 0m0.000s
rainman$ time python cfibbo.py 39
102334155

real 0m1.694s
user 0m1.690s
sys 0m0.000s

Сетевые языки надо тестить на сетевые задачи: обработка текста, преобразование и агрегация структур данных, работа с базами данных и т.п.

Reply

sidentdv October 4 2011, 18:53:16 UTC
вот только "хорошей" не выходит :) 1,5s vs 40microsec

1> c("a.erl", [native]).
{ok,a}
2> timer:tc(a,fib2,[40]).
{45,165580141}
3> timer:tc(a,fib2,[100]).
{42,573147844013817084101}
4> timer:tc(a,fib2,[1000]).
{966,
70330367711422815821835254877183549770181269836358732742604905087154537118196933579742249494562611733487750449241765991088186363265450223647106012053374121273867339111198139373125598767690091902245245323403501}
5> timer:tc(a,fib2,[10000]).
{13177,
...много цифр...}

6> timer:tc(a,fib2,[100000]).
{466374,
...еще больше цифр...}

7> timer:tc(a,fib2,[1000000]).
{62294024,
...совсем много цифр...}
итог:
40 - 45microsec
100 - 42microsec
1000 - 966microsec
10000 - 13ms
100000 - 466ms
1000000 - 62sec

Reply

rainman_rocks October 4 2011, 19:30:23 UTC
код, код покажите, а? Вы небося без рекурсии считаете. Эдак на чём угодно миллисекунды будут, даже на тикле.

А с рекурсией получается сложность O(2^n), поэтому там будет медленно даже на сях.

Reply

sidentdv October 4 2011, 19:50:10 UTC
Ну без рекурсии в эрланге сложновато, но в целом конечно правы :)

зы: код тут где-то в комментариях

Reply

rainman_rocks October 4 2011, 19:59:39 UTC
Не поленился, провёл эксперимент.

import sys
import time

def fib(x):
a, b = 1, 1
for i in xrange(x-1):
a, b = b, a+b
return b

n = int(sys.argv[1])
t = time.time()
r = fib(n)
t = time.time() - t
print (t*1000000, r)
...

4> timer:tc(fib2,fib2,[10000]).
{13999,
54438373113565281338734260...6846711185597501}
....
rainman@grandpiano ~/dev $ python fib.py 10000
(3570.079803466797, 54438373113565281338734260...0676846711185597501L)

Почти в 4 раза быстрее.

Kiss my shiny metal Python.

Reply

lionet October 5 2011, 00:36:50 UTC
Зря ты идёшь в оптимизацию функции, ибо не в этом поинт.

Reply


Leave a comment

Up