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)

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

C++11
user 0m0.000s

Глянул ассемблерный выхлоп — оно там константу загружает:

movl    $102334155, %edx
movl    $.LC0, %esi
movl    $1, %edi
xorl    %eax, %eax
call    __printf_chk
Так что сравнение не честное получается. Нужно в следующем тесте придумать методику, не позволяющую высчитывать константы. Пока сделал тупо с введением числа с stdin. Результат — 0.450. Между стековым D и Fantom. Добавил к результатам.

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

Проверил на нескольких десятках запусков — разницы в пределах точности измерений нет. Первые два знака всегда совпадают, третий знак пляшет ±1 знак то в одну сторону, то в другую.

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

и для полной картины не хватает CL с CLOS

Он объектный, разве?

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

Пока сделал тупо с введением числа с stdin

во-первых std::cin?!, во-вторых тогда вообще не имеет смысла добавлять отдельно С++11

Результат — 0.450. Между стековым D и Fantom. Добавил к результатам.

разницы не должно быть, вероятно она из-за «сделал тупо с введением числа с stdin»

Глянул ассемблерный выхлоп — оно там константу загружает

ну да :)

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

Передавать аргумент как параметр? :-)

Да, в итоге так и сделал.

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

разницы не должно быть, вероятно она из-за «сделал тупо с введением числа с stdin»

Видимо, работа с объектам по-разному сделана. А «тупо с stdin» — там не зря итак цикл на 10 вычислений стоит. Ввод и парсинг — это микросекунды. Пренебрежимо.

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

Видимо, работа с объектам по-разному сделана.

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

wota ★★
()

просьба проверить scala код. На моей машине такой вариант дает стабильный, пусть и небольшой, прирост.

case class Fib(n:Int){
  def value() : Int =
  {
    if(n <= 2)
      return 1

    val f1 = new Fib(n - 1)
    val f2 = new Fib(n - 2)
    return f1.value() + f2.value()
  }
}
RedPossum ★★★★★
()
Ответ на: комментарий от KRoN73

Это какие?

Вы выбросли оптимизированный тест на моно, оставив оптимизацию параметров для Java.

Кстати тест imho бессмыссленный.

Вы бы уж лучше скорость Reflection и презагрузки методов померили.
Это как никак фендаментальные фичи.

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

# http://www.balancer.ru/g/p1630772

Небольшие модификации кода убыстряют тест на Perl процентов на 10 на моей машине.

Скорее всего, это из-за добавленных ::, поясняющих Perl'у, что fib - это package, и искать в symbol table процедуру fib бесполезно. Кроме того, блоки BEGIN и END здесь не имеют никакого смысла (в man perlsub описано их предназначение).

AITap ★★★★★
()

Что будет в GCC 4.9
Технология многопоточности Intel Cilk Plus.

#include <stdio.h>
#include <stdlib.h>
#include <cilk/cilk.h>
#include <cilk/cilk_api.h>

#include <time.h>
#include <sys/time.h>

static inline unsigned long long cilk_getticks()
{
     struct timeval t;
     gettimeofday(&t, 0);
     return t.tv_sec * 1000000ULL + t.tv_usec;
}

static inline double cilk_ticks_to_seconds(unsigned long long ticks)
{
     return ticks * 1.0e-6;
}

int fib(int n)
{
    if (n < 2)
        return n;
    int x = cilk_spawn fib(n-1);
    int y = fib(n-2);
    cilk_sync;
    return x + y;
}

int main(int argc, char *argv[])
{
    // Fibonacci number to be calculated.  39 is big enough to take a
    // reasonable amount of time
    int n = 39;

    // If we've got a parameter, assume it's the number of workers to be used
    if (argc > 1)
    {
        // Values less than 1, or parameters that aren't numbers aren't allowed
        if (atoi(argv[1]) < 1)
        {
            printf("Usage: fib [workers]\n");
            return 1;
        }

        // Set the number of workers to be used
        __cilkrts_set_param("nworkers", argv[1]);
    }

    // Time how long it takes to calculate the nth Fibonacci number
    unsigned long long start = cilk_getticks();
    int result = fib(n);
    unsigned long long end = cilk_getticks();

    // Display our results
    double duration = cilk_ticks_to_seconds(end - start);
    printf("Fibonacci number #%d is %d.\n", n, result);
    printf("Calculated in %.3f seconds using %d workers.\n",
           duration, __cilkrts_get_nworkers());

    return 0;
}


 time ./a.out 
Fibonacci number #39 is 63245986.
Calculated in 1.189 seconds using 4 workers.

real	0m1.192s
user	0m4.739s
sys	0m0.000s

bhfq ★★★★★
()

Dart https://www.dartlang.org/

class Fib
{
  int n;
  Fib(this.n);
  int value()
  {
    if(n <= 2 )
    {
      return 1;
    }
    Fib f1 = new Fib(n-1);
    Fib f2 = new Fib(n-2);
    return f1.value() + f2.value();
  }
}

void main() {
  print(new Fib(40).value());
}

Просьба измерить время работы из консоли

time dart/dart-sdk/bin/dart fib.dart

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

Ага, и тему видел, и пул реквест сейчас получил :)

Только всё руки не доходили dart скачать и тесты прогнать. Сейчас получил pull-request и пнул, таки, себя :)

Результат для Dart вышел между C++ (boost) и D (heap). Есть подозрение, что на Ubuntu 13.10 наблюдается некоторая деградация скорости (на десяток запусков теста для PyPy лучший результат стал 11.9 сек. вместо прежнего 10.9 сек, т.е. на 9% медленнее). Точнее пока разбираться не стал, так как на позицию Dart в общем списке оно не повлияет, но записал в примечаниях.

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

Да, тайминги на Ububtu 13.10 изменились, но не только в сторону ухудшения. Так что это от версий зависит. PyPy, вот, стал процентов на 9 медленнее. Perl — на ~7% (результат чуть позже). Python и Python3 стали быстрее на 8% и на 6%, соответственно.

Добавил также HipHop PHP. Скорость вышла почти как и у старого PHP5.4 (на 2% быстрее). Новый PHP5.5 ещё не тестировал.

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

Небольшие модификации кода убыстряют тест на Perl процентов на 10 на моей машине.

Выложил. У меня вышло 362 секунды вместо 389 (+7%).

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