Производительность языков. Объектный Фибоначчи :)

 
1 2 3 4 5
+
-
edit
 

Balancer

администратор
★★★★★
waveM> Хмм, а почему тогда не рассматривается такой вариант на С++?

Потому что этого теста строго формально ещё нет :) На ЛОРе, как раз, ищем слабые места. Уже ясно, что мой вариант не подходит, так как возникает неистребимое желание выкинуть из теста неиспользуемые операции :) Вот и в твоём тесте нету обращений к уже имеющимся объектам в value()...

В общем, перепишу тест, чтобы не было желания сэкономить - выложу :)
 

grim

новичок
C# вариант со структурой. Примерно в 10 раз быстрее класса.
code text
  1. using System;
  2. class Fib
  3. {
  4.     public static void Main()
  5.     {
  6.         Fib1 x = new Fib1(40);
  7.         Console.WriteLine(x.value());
  8.     }
  9. }
  10.  
  11. internal struct Fib1
  12. {
  13.     private int _value;
  14.     public Fib1(int n) { _value = n; }
  15.     public int value()
  16.     {
  17.         if (_value <= 2)
  18.             return 1;
  19.  
  20.         Fib1 f1 = new Fib1(_value - 1);
  21.         Fib1 f2 = new Fib1(_value - 2);
  22.  
  23.         return f1.value() + f2.value();
  24.     }
  25.    
  26. }

Да, и в java варианте применён хак - увеличение размера начального блока для классов, позволяющий не освобождать память до конца программы. Не знаю это корректно в рамках данного теста или нет. Тестируем ведь работу с объектами: создание/удаление. Или я не прав?
 3.6.123.6.12

grim

новичок
grim> Да, и в java варианте применён хак - увеличение размера начального блока для классов, позволяющий не освобождать память до конца программы. Не знаю это корректно в рамках данного теста или нет. Тестируем ведь работу с объектами: создание/удаление. Или я не прав?

Я имею в виду вариант "Java (server)"
 3.6.123.6.12

Balancer

администратор
★★★★★
grim> C# вариант со структурой.

Структуры в C#, разве, могут быть с наследованием?
 9.0.587.09.0.587.0
+
-
edit
 

Luchnik

аксакал
★☆
Balancer> Структуры в C#, разве, могут быть с наследованием?
Наследоваться от структур и других расширений System.ValueType - нельзя.

Видимо, вариант со структурой быстрее за счёт того, что создание экземпляров идёт в стеке, а не в куче. И за счёт упрощённого в сравнении с классами конструирования экземпляров.
 
+
-
edit
 

Balancer

администратор
★★★★★
Luchnik> Наследоваться от структур и других расширений System.ValueType - нельзя.

Тогда вариант не катит :) В следующей версии ещё обязательно пару-тройку наследований в глубину сделаю. Это тоже очень важный для оценки скорости параметр. У меня на PHP во фреймворке и то в среднем уровень наследования равен четырём, а часто - пяти :) Правда, один уровень исторически сложился и его можно будет снести, но пока - так.
 9.0.587.09.0.587.0

grim

новичок
Balancer> Тогда вариант не катит :)
Ну, это не чесно :(
Применение структуры вместо класса иногда очень помогает ускорить участок программы.

Тогда уж давайте и работу со списками добавим и с дженериками и прочее.

Хотя по моему нужно оставить тест как есть. Он имел когда-то конкретную цель и если структуры её решают, вы предлагаете считать эту цель неправильно и изменить, только для того, чтобы выбить конкретную особенность языка?
 3.6.123.6.12

Balancer

администратор
★★★★★
grim> Ну, это не чесно :(

Так задача такая звучит :) Оценить скорость полноценной работы с объектами. И наследование тут сегодня очень важный фактор.

grim> Применение структуры вместо класса иногда очень помогает ускорить участок программы.

Безусловно. Но это уже другая задача :)

grim> Тогда уж давайте и работу со списками добавим и с дженериками и прочее.

Как вариант. Но это будет уже третья задача.

grim> Хотя по моему нужно оставить тест как есть.

Поэтому его обновление будет идти уже в рамках нового теста :) А старый продолжать смысла нет, так как уже нет того железа и ОС, чтобы тестирование шло в равных условиях.
 3.6.123.6.12

+
-
edit
 

Balancer

администратор
★★★★★
Реинкарнация теста в современных условиях :)

1. Все тесты лежат на GitHub: Balancer/benchmarks-fib-obj · GitHub

2. К каждому тесту прилагается скрипт, с которого получались результаты.

3. Сводная таблица с результатами выкладывается на GitHub Wiki: https://github.com/.../Результат-теста:-i3-2.2ГГц

В процессе пополнения.

За прошедшие годы есть интересные изменения.
— Java и Scala стали быстрее. Уже не в 5 раз медленнее, чем С++ с объектами на стеке, а только вдвое.
— Scala сравнялась по скорости с Java, догнал их и Fantom
— Ruby ещё прибавил в скорости, от C++ с кучей отстаёт не в 13-18 раз, а в 8.
— Ruby уверенно обошёл Python.

Продолжу тесты чуть позже. Также, поскольку оно на GitHub, желающие могут присоединяться :)
 2828
+
-
edit
 

Balancer

администратор
★★★★★
Добавлены Go, C#/mono, JRuby.

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

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

Судя по всему, 5 лет назад я бинарник собирал компилятором от MS (msc — это ж оно?) и, видимо, он много эффективнее, чем gmcs. Или я не допёр, что там кроме --optimize+ можно указать.
 2828
?? Balancer #19.10.2013 01:03  @Balancer#19.10.2013 00:39
+
-
edit
 

Balancer

администратор
★★★★★
Balancer> Судя по всему, 5 лет назад я бинарник собирал компилятором от MS (msc — это ж оно?)

Т.е. csc, наверное.

В общем, cобрал .net-exe-шник под Windows. Нифига не изменилось. Судя по всему, это у mono такая деградация сильная.
 28.0.1500.9528.0.1500.95
+
-
edit
 

Nikita

аксакал

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

Что csc, что gmcs строят IL-код. Там почти нет оптимизаций, и он тривиален в этом плане. За итоговую компиляцию в машинный код отвечают совсем другие компоненты.
Учитесь читать.  10.010.0
+
-
edit
 

Balancer

администратор
★★★★★
Значит, как и я подумал, mono так деградировал…

С другой стороны странно, .NET-exe-шник от Boo, работающий на том же mono, работает на треть быстрее. И в сравнении с C++/heap сохраняет примерно ту же скорость, что и раньше.
 2828
+
-
edit
 

Balancer

администратор
★★★★★
Добавлены PyPy (офигенный результат 10.9 сек, на уровне хипового Си++) и C++11 (0.450 сек, между D(stack) и Fantom).

Кстати, что интересно, при явном указании константности, C++11 вычисляет результат ещё на этапе компиляции.
 28.0.1500.9528.0.1500.95
Это сообщение редактировалось 22.11.2013 в 02:48
+
-
edit
 

Balancer

администратор
★★★★★
Добавлен результат для языка Dart. Получилось между C++ (boost) и D (heap). Тест получен как первый pull-request :)

Dart: Structured web apps

About 5 minutes Dart is class based and object oriented, without being dogmatic. About 1 hour Write a Dart web app, even if you've never written a web app before. About 1 day Dart has lots of tools, libraries, and documentation, plus a developer community. All modern browsers (both desktop and mobile) can run Dart web apps, thanks to our Dart-to-JavaScript compiler. You can probably already read and even write Dart code. See more samples. Write less. Say more. Add types to your code to help people and tools. // Дальше — www.dartlang.org
 

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

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

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

Balancer

администратор
★★★★★
hhvm 3.5.x получился втрое быстрее, чем 2.x И сильно обошёл чистый PHP, лишь вдвое уступив C#

Пополнил таблицу на

Unicorn! · GitHub

We didn't receive a proper request from your browser. Sorry about that. Please try refreshing and contact us if the problem persists. // github.com
 
 4040
+
-
edit
 

Jameson

опытный

попробуйте еще ABCPascalNET. можно отдельно проверить opemnp. :) я был в шоке. похоже фирма embarcadero испортила компилятор с паскаля. или они просто взяли free pascal компилятор. потмоу что елки. ABC паскаль для net может делать не менее а иногда и куда более шустрый код. кхм.
 30.0.1599.10130.0.1599.101
+
-
edit
 

Balancer

администратор
★★★★★
Давно не обновлял цифры производительности в «Объектном Фибоначчи».

Balancer/benchmarks-fib-obj

benchmarks-fib-obj - Тесты «Объектный Фибоначчи» для разных языков. // github.com
 

PHP7 обошёл и Ruby, и Python. Но по-прежнему здорово проигрывает HHVM. Есть и другие, хоть и менее заметные перестановки. Думаю, надо выкроить пол-часика, изучить поверхностно Rust и слепить тест для него. На днях попробую пощупать.
 33
+
-
edit
 

Balancer

администратор
★★★★★
Вчера в голову пришла мысль измерить Rust. Заодно, решил посмотреть, что за язык получился :) На знакомство с языком и написание теста ушло 15 минут, так что, возможно, его качество далеко от идеала. Потому тему и завёл, может, где-то грубо ляпнул. Я даже не знаю до сих пор, как дело в Rust со сборкой мусора обстоит и он эквивалент по этой классификации Java/C-хипового или C-стекового.

Вот мой первый вариант: https://github.com/Balancer/benchmarks-fib-obj/.../sources/rust/fib.rs

Получилось 0.603 сек., что почти вдвое хуже стекового Си (0.350) и немного лучше Java (0.685) со сборкой мусора.

Обновлённая таблица с результатами: https://github.com/.../Результат-теста:-i3-2.2ГГц
 33
+
-
edit
 

Balancer

администратор
★★★★★
Небольшое обновление теста.

Добавил JavaScript. Результат отличный — 2.64 сек. Почти как у Dart'а, лучше, чем у D. Похоже, сегодня это самый быстрый скриптовый язык.

Обновил:

PHP до 7.1.0. Стал чуть-чуть быстрее, 50.6 против 58.0 у t.0.13

HHVM практически не изменился. 24.5 против 25.0

Python до 3.5.2 и 2.7.12. Удивительно, но он стал ещё медленнее — 170 и 153 сек. против прежних 145/129.
 44
DE alexsolo #22.01.2017 21:42  @Balancer#18.01.2017 19:55
+
-
edit
 

alexsolo

новичок
Balancer> Небольшое обновление теста.

Добавьте моего тормоза.

code text
  1. import time
  2.  
  3. fibs = {0: 0, 1: 1}
  4. def fib(n):
  5.     if n in fibs: return fibs[n]
  6.     if n % 2 == 0:
  7.         fibs[n] = ((2 * fib((n / 2) - 1)) + fib(n / 2)) * fib(n / 2)
  8.         return fibs[n]
  9.     else:
  10.         fibs[n] = (fib((n - 1) / 2) ** 2) + (fib((n+1) / 2) ** 2)
  11.         return fibs[n]
  12.  
  13. s = time.time()
  14. fib(100000)
  15. print("Time (s): %f" % (time.time() - s))
 55.0.2883.8755.0.2883.87
RU Balancer #22.01.2017 21:50  @alexsolo#22.01.2017 21:42
+
-
edit
 

Balancer

администратор
★★★★★
alexsolo> Добавьте моего тормоза.

Это другая задача :)

Производительность языков. Объектный Фибоначчи :) [Balancer#24.11.08 12:09]

… Тогда уже почему бы не считать Фибоначчи итеративно? Или с хвостовой переменной? См. с самого начала для чего предназначен этот тест.// Программирование
 


Производительность языков. Объектный Фибоначчи :) [Balancer#21.09.09 16:55]

… Потому что это цель теста. Поверь, для простого вычисления чисел Фибоначчи есть куда более подходящие способы … Я тут подобрал более актуальный пример (ближе к реалиям), но тестить буду позже и уже в отдельной теме. Вот, например, вариант на Java: code java class FibObj2 {         private int _value ;         private FibObj2 _prev1 ;         private FibObj2 _prev2 ;         private int [ ] _foo = new…// Программирование
 


Самоцитата с Гитхаба:

Предупреждаю сразу — эти тесты созданы не для того, чтобы считать Фибоначчи. Постоянно появляется очередной Кэп О., глубокомысленно заявляющий, что это неоптимальный метод для вычисления чисел Фибоначчи. Причём, что характерно, в качестве решения чаще предлагают рекурсивный же алгоритм, но без объектов. Господа-товарищи, тест служит не для этого. А если уж хотите менять алгоритм, то используйте не рекурсивный, а итеративный. Или с локальными переменными :)
 
 44
DE alexsolo #22.01.2017 21:56  @Balancer#22.01.2017 21:50
+
-
edit
 

alexsolo

новичок
alexsolo>> Добавьте моего тормоза.
Balancer> Это другая задача :)

А, увидел. Сорри. Ну, давайте расширим тест - скажем, посчитать 1 000 000 000 Фибоначи, вот это будет цирк когда грамотный алгоритм скриптового языка будет уделывать Си :)
В случае, если надумаете по скорости сравнить (а вдруг? :)) то вот что у меня вышло на java без всяких рекурсий

\jdk1.7.0_79\bin\java" -Xms512m -Xmx4096m -server Fibonacci 1000000000
Number of bits: 694241913
First 10 bytes: 01 62 80 b8 2d 8c be 0e dc 1b
Last 10 bytes : a9 53 2d f4 d2 d2 5b 5d b6 3b
Time (ms): 208597.119691
 55.0.2883.8755.0.2883.87
Это сообщение редактировалось 22.01.2017 в 22:25
Последние действия над темой
1 2 3 4 5

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru