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

 
1 2 3 4 5
+
-
edit
 

Balancer

администратор
★★★★★
А... Там есть ряд проблем. Ещё надо будет повозиться :)
 

Lerm

втянувшийся
Опять микробенчмарки... :D

Для Java тогда нужно указывать не столько параметры компиляции, сколько параметры запуска...

Хотелось бы увидеть результат запуска с примерно такими параметрами:
-server -Xms128m -Xmx128m -XX:NewSize=64m
You live and learn. Or you don't live long.  
Это сообщение редактировалось 03.08.2008 в 17:51
+
-
edit
 

[AvataR]

новичок
Для лиспа с CLOS:
code lisp
  1. (defun new-Fib (value)
  2.         (make-instance 'Fib :Value value))
  3.  
  4. (defclass Fib ()
  5.         ((Value :initform 0
  6.                                         :initarg        :Value
  7.                                         :accessor Value)))
  8.  
  9. (defgeneric get-value (Object))
  10.  
  11. (defmethod get-value ((Object Fib))
  12.         (if (<= (Value Object)
  13.                                         2)
  14.                         1
  15.                         (+ (get-value (new-Fib (- (Value Object)
  16.                                                                                                                                 1)))
  17.                                  (get-value (new-Fib (- (Value Object)
  18.                                                                                                                                 2))))))
  19.        
  20.  
  21. (defun Fib-no-class (x)
  22.         (if (<= x
  23.                                         2)
  24.                         1
  25.                         (+ (Fib-no-class (- x
  26.                                                                                                         2))
  27.                                  (Fib-no-class (- x
  28.                                                                                                         1)))))
  29.  
  30.  
  31. ;; (print "Single with classes:")
  32. ;; (time (get-value (new-Fib 40)))
  33.  
  34. ;; (print "Single without classes:")
  35. ;; (time (Fib-no-class 40))
  36.  
  37. ;; (print "10 times:")
  38. ;; (time (loop for i from 1 to 10
  39. ;;                               do (get-value (new-Fib 40))))


То шо закоменчено лучше зайзать в какомнить REPL что бы не было погрешностей на старт


У меня на один проход без CLOS с такой вот рекурсией как в примерах около 8 сек, а с CLOS - 40-50
 
+
-
edit
 

[AvataR]

новичок
C++ вариант с new на Pentium-M 1.7 - 22 сек однопроходно и 419/10 - соотв. на 10 проходов.
C# - 15 O_O
 
+
-
edit
 

Balancer

администратор
★★★★★
Lerm> Опять микробенчмарки... :D

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

- Степень падения производительности Си++ при использовании хипа (понятно было, что медленнее, но чтобы настолько!)

- То, что под .NET есть эффективные нетипчные компиляторы, выжимающих максимум из VM.

- Что Boo настолько быстрее обычного Питона.

- Что Ruby 1.9, действительно, сделал большой шаг вперёд по производительности.

- Что Scala под JVM реально быстра, но с динамическими языками под JVM всё весьма плохо :)

Lerm> Для Java тогда нужно указывать не столько параметры компиляции, сколько параметры запуска...

В наше время они вылизаны неплохо :) Впрочем, ты прав:

Lerm> Хотелось бы увидеть результат запуска с примерно такими параметрами:
Lerm> -server -Xms128m -Xmx128m -XX:NewSize=64m

Получилось 2.5 секунды (по 10 тестов в цикле, минимум из трёх опытов). Сейчас подправлю таблицу. Хотя приницпиально расклад это не меняет :) Но спасибо за тычок. В L2 от параметров JVM производительность зависела мало.
 
+
-
edit
 

Kernel3

аксакал

Balancer> - Степень падения производительности Си++ при использовании хипа (понятно было, что медленнее, но чтобы настолько!)
Ага. Сказывается отсутствие автоматической сборки мусора: компилятор не считает нужным оптимизировать даже тривиальные случаи вроде данного. Правда, таки надо на Студии ещё попробовать :)
Broken Windows® cures my ills and makes me feel alright... ©  
RU Balancer #03.08.2008 21:32  @[AvataR]#03.08.2008 18:07
+
-
edit
 

Balancer

администратор
★★★★★
AvataR> Для лиспа с CLOS:

Есть точная инфа, какой пакет для Убунты качать? :) А то неохота качать лишнего по GPRS, трафик дорогой :D

clos нету, "common lisp" пакетов - целая куча... В основном библиотеки какие-то.

GNU CLISP, a Common Lisp implementation - не оно? Однако, 10Мб с зависимостями хочет :)
 
+
-
edit
 

Balancer

администратор
★★★★★
Kernel3> Правда, таки надо на Студии ещё попробовать :)

Угу. И icc. На Computer Language Benchmarks Game он в среднем получается на 20% быстрее gcc в числодробилках. Вдруг вытянет в объектах больше :)
 
+
-
edit
 

[AvataR]

новичок
CLOS есть в любой реализации CL (=
Мерять на cmucl и/или SBCL. CLISP ужасный тормоз )
На GCL без классов быстрее раза в 4, но его надо дергать из cvs. И с CLOS там какая то фигня ^_^
Про убунту - хз.
 
+
-
edit
 

Balancer

администратор
★★★★★
Есть cmul: The CMUCL lisp compiler and development system

и sbcl: A Common Lisp compiler and development system

И тот, и другой - по 30+Мб. Так что протестирую уже только кода вернусь из деревни.
 

Murkt

Pythoneer

Балансер, опять меряешь сферических коней? Руби 1.9 быстрее Питона только на рекурсиях с малым количеством кода, причина - просто дешевле вызов функции (у Питона есть всякие *args, **kwargs, у Руби - нет).
[team Їжачки - сумні падлюки]  
+
-
edit
 

Balancer

администратор
★★★★★
Murkt> Балансер, опять меряешь сферических коней?

Нет, измеряю время генерации классов и вызовов методов :) Вроде, все исходники привёл, неужели не видны? :D

Murkt> Руби 1.9 быстрее Питона только

В этом тесте, кстати, не быстрее, а имеет равную скорость с точностью до погрешности измерений.

Murkt> на рекурсиях с малым количеством кода, причина - просто дешевле вызов функции (у Питона есть всякие *args, **kwargs, у Руби - нет).

На чём Питон из адекватных ему задач должен быть заметно быстрее Ruby 1.9, по-твоему? Желательно из практики, а не теории :) Давай прикинем.

Очевидно, что Питон должен быть быстрее в числодробилках. Но это всё равно не его ниша. Уже на уровне серверных фреймворков считать надо мало, а вот вызовов обрабатывать много. На десктопе в GUI аналогично, вроде бы :) Куда ни кинь, в коде приложений всё объекты и их методы...
 
+
-
edit
 

Murkt

Pythoneer

Murkt>> Руби 1.9 быстрее Питона только
Balancer> В этом тесте, кстати, не быстрее, а имеет равную скорость с точностью до погрешности измерений.
Murkt>> на рекурсиях с малым количеством кода, причина - просто дешевле вызов функции (у Питона есть всякие *args, **kwargs, у Руби - нет).
Вот потому что здесь есть не только рекурсия, а и ещё пару действий (создание класса) - руби имеет равную скорость. Ну и ещё сама виртуальная машина стартует чуть быстрее (правда, это относится к 1.8.6, не знаю как с 1.9). Во всех остальных случаях - медленнее. Работа со строками, списковые выражения, подавляющее большинство stdlib (и сишные, и на чистом языке) в Питоне быстрее. Особенно большая разница, когда работаешь больше со встроенными типами данных - int, long, tuple, list, dict, etc, а не используешь на каждом шагу свой спец-класс :)

Balancer> Очевидно, что Питон должен быть быстрее в числодробилках. Но это всё равно не его ниша.
Люди, которые разрабатывают или используют numpy/scipy с тобой поспорили бы :)

Balancer> Уже на уровне серверных фреймворков считать надо мало, а вот вызовов обрабатывать много. На десктопе в GUI аналогично, вроде бы :) Куда ни кинь, в коде приложений всё объекты и их методы...
Для того, чтобы Руби был быстрее, нужно очень мало кода, и очень много вызовов функций :) Можешь заценить Shootout: Python vs. YARV
[team Їжачки - сумні падлюки]  
+
-
edit
 

Murkt

Pythoneer

Kernel3> http://www.gentoo.org/security/en/glsa/glsa-200807-16.xml
Это к чему? Может нужно найти ссылки на списки багов в том же Руби, или в Джаве (тут они вообще километровые)?
[team Їжачки - сумні падлюки]  

Kernel3

аксакал

Murkt> Это к чему? Может нужно найти ссылки на списки багов в том же Руби, или в Джаве (тут они вообще километровые)?
Можно. Тоже критерий для сравнения, да :) :)
Broken Windows® cures my ills and makes me feel alright... ©  
+
-
edit
 

Kernel3

аксакал

Да, у меня Студийная аппликуха на тестовой машине (Pentium D 2.8GHz) выполнилась за 17,3 сек. Это хиповый вариант.
Broken Windows® cures my ills and makes me feel alright... ©  

Murkt

Pythoneer

Руби:

Множественные уязвимости в Ruby | информационный портал по безопасности

Удаленный пользователь может получить доступ к важным данным, вызвать отказ в обслуживании и скомпрометировать целевую систему. // www.securitylab.ru
 

404 Not Found

The requested URL /log/1079/rubys-vulnerability-handling-debacle/ was not found on this server. // www.matasano.com
 

Ruby 'rb_ary_fill()' Remote Denial Of Service Vulnerability

Ruby is an object-oriented scripting language. Ruby is prone to a remote denial-of-service vulnerability. A integer-overflow in 'rb_ary_fill()' can be exploited to cause denial-of-service conditions in affected applications. The problem stems from a lack of sanity checking on user-supplied input. Successful exploits may allow remote attackers to cause denial-of-service conditions. Juniper Networks provides this content via a wide variety of sources and production methods. If notified of errors or omissions in the content of this page, Juniper Networks, at its discretion, will modify or remove the page or leave the content as is, depending on various factors including but not limited to the reputation and authority of the party providing the notification. // Дальше — www.juniper.net
 

для джавы нашёл замечательные списочки:

Java SE 6 Update Release Notes

Update Release Notes summarize changes made in all 1.6.0 update releases. Note that bug fixes are cumulative, that is, bug fixes in previous update versions are included in subsequent update versions. The version numbers are given for each update release, complete with build number. To determine the version of your JDK software, use the following command: Bug Database - In most cases, the bug ID number for each bug fixed is a link to the detailed bug report on the Bug Database (Bug Parade) web site. Bug Database enables you to file your own bug reports, add comments to existing bug reports, and vote for the bugs you consider most important. // Дальше — java.sun.com
 

И ниже по странице. Можно такие же и для пятой посмотреть.
[team Їжачки - сумні падлюки]  
+
-
edit
 

[AvataR]

новичок
Вообще надо другой бенч сделать. Штук 5 классов, желательно со множественным наследованием, и дергать их методы.
 
+
-
edit
 

Kernel3

аксакал

А смысл? Особенно, учитывая то, что множественное наследование как таковое есть не везде. Тогда уж производительность распознавания типа объекта во время исполнения мерять.
Broken Windows® cures my ills and makes me feel alright... ©  
+
-
edit
 

[AvataR]

новичок
Смысл прост - дерганье метода давольно тяжелая операция. Опять же. Во время исполнения не все может явно распознавать классы (=
Можно и без множественного
 
+
-
edit
 

Kernel3

аксакал

Дёрганье метода - очень простая операция при отсутствии виртуальных методов и виртуального же наследования.
Broken Windows® cures my ills and makes me feel alright... ©  
+
-
edit
 

[AvataR]

новичок
Я вообще дерганья виртуальных ф-й и имел в виду
 
+
-
edit
 

Kernel3

аксакал

Аа. Ну, тогда имеет смысл, наверное.
Broken Windows® cures my ills and makes me feel alright... ©  
1 2 3 4 5

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