[image]

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

 
1 2 3 4 5
+
-
edit
 

Balancer

администратор
★★★★★
программирование техника компьютеры
В общем, чисто функциональные вызовы сегодня интересуют программиста всё меньше. Вот генерация объектов и вызовы методов - то, что реально актуально. Посему - модифицирую бенч :)

Upd [21.09.09]: поменялась машина, OS, изменились версии. Так что старую таблицу поддерживать невозможно. Начну новую:

ЯзыкВремя, секПодробности
C++ (stack)0,495g++ 4.3.4
Java (server)2,331.6.0_16-b01
C++ (boost)3,42g++ 4.3.4
Java4,991.6.0_16-b01
Fan6,25Fan 1.0.46
Boo14,0Boo 0.9.1.3287 (Mono 2.4.2.3)
C++ (heap)20,9g++ 4.3.4
Ruby 1.92751.9.1p243
Python 2.5487Python 2.5.4
Python 2.6 (psyco.full)586Python 2.6.2, psyco 1.6
Python 2.6611Python 2.6.2


Старая таблица:

ЯзыкВремя, сек.ВерсияОпции компиляцииСреда исполнения
C++ (stack)0,66GCC (Ubuntu 4.2.3-2ubuntu7)g++ -O3 fib.cppnative
Java (server)2,5Sun Java 1.6.0_06javac Fib.javaSun Java 1.6, -server -Xms128m -Xmx128m -XX:NewSize=64m
Scala3,8Scala 2.3.0scalac fib.scalaSun Java 1.6
Java3,9Sun Java 1.6.0_06javac Fib.javaSun Java 1.6
Nemerle8,9Nemerle Compiler (ncc) version 0.9.3 (release)ncc fib.nMono 1.2.6
Nemerle w pat.match. 9,3 Nemerle Compiler (ncc) version 0.9.3 (release)ncc fib.nMono 1.2.6
Boo9,8Boo 0.8.0.2730booc fib.booMono 1.2.6
C# (mono)11,1Mono C# compiler version 1.2.6.0mcs fib.csMono 1.2.6
С++ (heap)16,6GCC (Ubuntu 4.2.3-2ubuntu7)g++ -O3 fib-heap.cppnative
Python+Psyco41-42[1]Python 2.5.2 + Psyco 1.5.1-3-Python 2.5.2
Ruby 1.9310ruby 1.9.0 (2007-12-25 revision 14709) [i486-linux]-ruby 1.9.0
Python313Python 2.5.2-Python 2.5.2
Jython493Jython 2.2.1jythonc fibSun Java 1.6
Ruby 1.8662ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]-ruby 1.8.6
JRuby (интерпретация)970i386-jruby1.0.2-i386-jruby1.0.2
PHP1328PHP 5.2.4-2ubuntu5.2 cli-PHP 5.2.4


Все измерения - на Celeron 1,8ГГц под Ubuntu 8.04.01

Исходники ниже отдельными постингами.

Время работы измеряется по time, выбирается минимальное в серии из 2-3 запусков. Хотелось бы измерить и потребляемую память, но time никак не хочет понимать опцию --format. Кто-то подскажет пример её использования?

Для Си++ и Java результат - усреднение десяти измерений в цикле.

Примечания
1. По поводу Python + psyco см. Производительность языков. Объектный Фибоначчи :) [Balancer#24.11.08 07:54]
   
Это сообщение редактировалось 21.09.2009 в 02:00
+
-
edit
 

Balancer

администратор
★★★★★
Исходники.

С++:
code cpp
  1. #include <stdio.h>
  2.  
  3. class Fib
  4. {
  5.   private:
  6.      int _value;
  7.  
  8.   public:
  9.     Fib(int n) { _value = n; }
  10.  
  11.     int value()
  12.     {
  13.         if(_value <= 2)
  14.             return 1;
  15.  
  16.         Fib f1 = Fib(_value - 1);
  17.         Fib f2 = Fib(_value - 2);
  18.  
  19.         return f1.value() + f2.value();
  20.     }
  21. };
  22.  
  23. int main()
  24. {
  25.     for(int i=0; i<10; i++)
  26.     {
  27.         Fib x = Fib(40);
  28.         printf("n=%d\n", x.value());
  29.     }
  30.     return 0;
  31. }
   
+
-
edit
 

Balancer

администратор
★★★★★
Java:
code java
  1. class Fib
  2. {
  3.     private final int _value;
  4.  
  5.     Fib(int n) { _value = n; }
  6.  
  7.     public int value()
  8.     {
  9.         if(_value <= 2)
  10.             return 1;
  11.  
  12.         Fib f1 = new Fib(_value - 1);
  13.         Fib f2 = new Fib(_value - 2);
  14.  
  15.         return f1.value() + f2.value();
  16.     }
  17.  
  18.     public static void main(String[] argv)
  19.     {
  20.         for(int i=0; i<10; i++)
  21.         {
  22.             Fib x = new Fib(40);
  23.             System.out.println(x.value());
  24.         }
  25.     }
  26. }
   
+
-
edit
 

Balancer

администратор
★★★★★
Boo:
code boo
  1. class Fib:
  2.     _value as uint
  3.  
  4.     def constructor(n as uint):
  5.         _value = n
  6.  
  7.     def value() as uint:
  8.         if(_value <= 2):
  9.             return 1
  10.  
  11.         return Fib(_value - 1).value() + Fib(_value - 2).value()
  12.  
  13. print Fib(40).value()
   
+
-
edit
 

Balancer

администратор
★★★★★
Python:
code python
  1. import psyco
  2. psyco.full()
  3.  
  4. class Fib:
  5.     def __init__(self, n):
  6.         self._value = n
  7.  
  8.     def value(self):
  9.         if(self._value <= 2):
  10.             return 1
  11.  
  12.         f1 = Fib(self._value - 1)
  13.         f2 = Fib(self._value - 2)
  14.  
  15.         return f1.value() + f2.value()
  16.  
  17. print Fib(40).value()
   
+
-
edit
 

Kernel3

аксакал

В плюсах объект на стеке, а не в хипе - это так и задумано? А если new сделать, как результат изменится? :)
   
+
-
edit
 

Balancer

администратор
★★★★★
Kernel3> В плюсах объект на стеке, а не в хипе - это так и задумано? А если new сделать, как результат изменится? :)

Ща проверим :) Как вариант с PHP досчитается :D
   
+
-
edit
 

Balancer

администратор
★★★★★
Вариант с хипом будет:
code cpp
  1. #include <stdio.h>
  2.  
  3. class Fib
  4. {
  5.   private:
  6.      int _value;
  7.  
  8.   public:
  9.     Fib(int n) { _value = n; }
  10.  
  11.     int value()
  12.     {
  13.         if(_value <= 2)
  14.             return 1;
  15.  
  16.         Fib *f1 = new Fib(_value - 1);
  17.         Fib *f2 = new Fib(_value - 2);
  18.  
  19.         int n1 = f1->value();
  20.         int n2 = f2->value();
  21.  
  22.         delete(f1);
  23.         delete(f2);
  24.  
  25.         return n1+n2;
  26.     }
  27. };
  28.  
  29. int main()
  30. {
  31.     for(int i=0; i<10; i++)
  32.     {
  33.         Fib *x = new Fib(40);
  34.         printf("n=%d\n", x->value());
  35.         delete(x);
  36.     }
  37.     return 0;
  38. }


Пока не бенчу, т.к. PHP ещё не закончил работу :) Пожалуй, обойдусь одним измерением :D

...

Да, PHP, соответственно:

code php
  1. <?php
  2.  
  3. class Fib
  4. {
  5.     var $value;
  6.     function __construct($n)
  7.     {
  8.         $this->_value = $n;
  9.     }
  10.  
  11.     function value()
  12.     {
  13.         if($this->_value <= 2)
  14.             return 1;
  15.  
  16.         $f1 = new Fib($this->_value - 1);
  17.         $f2 = new Fib($this->_value - 2);
  18.  
  19.         return $f1->value() + $f2->value();
  20.     }
  21. }
  22.  
  23. $x = new Fib(40);
  24. echo $x->value()."\n";
   
+
-
edit
 

Balancer

администратор
★★★★★
Багу поймал, в code-тэге обратный слеш кушается. Но с этим буду разбираться уже в Москве, когда вернусь.
   
+
-
edit
 

Balancer

администратор
★★★★★
Добавил PHP и Си++ с heap'ом.
   
+
-
edit
 

Kernel3

аксакал

Жёстко. Надо будет на MSVC++ попробовать в понедельник.
   
+
-
edit
 

Balancer

администратор
★★★★★
Сейчас спать иду, завтра - гости с утра, так что или завтра вечером, или в понедельник продолжу.

Perl, Nemerle, Scala ожидаются. М.б. ещё что-то добавлю.
   
+
-
edit
 

Balancer

администратор
★★★★★
Nemerle:
code nemerle
  1. using System;
  2.  
  3. public class Fib
  4. {
  5.     private _value : int;
  6.  
  7.     public this(n : int) { _value = n }
  8.  
  9.     public value() : int
  10.     {
  11.         if(_value <= 2)
  12.             1
  13.         else
  14.             Fib(_value - 1).value() + Fib(_value - 2).value()
  15.     }
  16.  
  17.     public static Main() : void
  18.     {
  19.         Console.WriteLine(Fib(40).value())
  20.     }
  21. }
   
+
-
edit
 

Balancer

администратор
★★★★★
Nemerle with pattern matching
code nemerle
  1. using System;
  2.  
  3. public class Fib
  4. {
  5.     private _value : int;
  6.  
  7.     public this(n : int) { _value = n }
  8.  
  9.     public value() : int
  10.     {
  11.         match(_value)
  12.         {
  13.             | 1 => 1
  14.             | 2 => 1
  15.             | _ => Fib(_value - 1).value() + Fib(_value - 2).value()
  16.         }
  17.     }
  18.  
  19.     public static Main() : void
  20.     {
  21.         Console.WriteLine(Fib(40).value())
  22.     }
  23. }
   
+
-
edit
 

Balancer

администратор
★★★★★
Jython - версия такая же, как и Питоновская.
   
+
-
edit
 

Balancer

администратор
★★★★★
Ruby:
code ruby
  1. class Fib
  2.     def initialize(n)
  3.         @_value = n
  4.     end
  5.  
  6.     def value()
  7.         if(@_value <= 2)
  8.             return 1
  9.         end
  10.  
  11.         return Fib.new(@_value - 1).value() + Fib.new(@_value - 2).value()
  12.     end
  13. end
  14.  
  15. print Fib.new(40).value()
   
+
-
edit
 

Balancer

администратор
★★★★★
Scala:
code scala
  1. class Fib(n:Int)
  2. {
  3.     var _value : Int = n
  4.  
  5.     def value() : Int =
  6.     {
  7.         if(_value <= 2)
  8.             return 1
  9.  
  10.         val f1 = new Fib(_value - 1)
  11.         val f2 = new Fib(_value - 2)
  12.         return f1.value() + f2.value()
  13.     }
  14. }
  15.  
  16. object FibTest
  17. {
  18.     def main(args: Array[String]) =
  19.         Console.println((new Fib(40)).value())
  20. }
   
+
-
edit
 

Balancer

администратор
★★★★★
JRuby - версия для Ruby. Только режим интерпретации, ибо не компилируется:
Error — Not compilable: Can't compile class definitions safely: ClassNode [Colon2Node [Fib]]


C#:
code csharp
  1. using System;
  2.  
  3. class Fib
  4. {
  5.     private int _value;
  6.  
  7.     Fib(int n) { _value = n; }
  8.  
  9.     public int value()
  10.     {
  11.         if(_value <= 2)
  12.             return 1;
  13.  
  14.         Fib f1 = new Fib(_value - 1);
  15.         Fib f2 = new Fib(_value - 2);
  16.  
  17.         return f1.value() + f2.value();
  18.     }
  19.  
  20.     public static void Main()
  21.     {
  22.         Fib x = new Fib(40);
  23.         Console.WriteLine(x.value());
  24.     }
  25. }
   
+
-
edit
 

Balancer

администратор
★★★★★
Jython, как я понял, объекты сам создавать не умеет и поэтому из конкурса выбывает.

За Perl пока не берусь, там ООП не честное, а через package, надо разбираться как. Позже.
   
+
-
edit
 

Balancer

администратор
★★★★★
Хотел собрать Scala с -target:msil, чтобы под Mono оценить, но не заработало. Опция игнорируется, всё равно так и собирается версия под JVM.
   
+
-
edit
 

Balancer

администратор
★★★★★
Добавил Ruby 1.9. Однако, нехило рулит :D Обошёл (хотя в пределах погрешлности) Python!
   
+
-
edit
 

Balancer

администратор
★★★★★
Все быстродействующие тесты прогнал ещё по 3-5 раз. Соответственно, результаты их улучшились, некоторые с 11 секунд скатились до 9 :)

Интересны разрывы.

Стековый Си++ -> Scala/Java = 5.8раз.

Scala/Java -> Mono = ~2.3 раза

Си++ хиповые -> Ruby1.9/Python = ~19 раз.

Также интересно, что пока не попалось ни одного языка, с быстродействием между 20 и 300 секундами.
   
RU Alexandrc #03.08.2008 15:23
+
-
edit
 

Alexandrc

аксакал

А без вывода на экран и в цикле, чтобы среднее время за, скажем, сотню раз?

З.Ы. Ром, список собственных сообщений можно хронологически упорядочить?
Сорри за офф :F
   
RU Balancer #03.08.2008 16:13  @Alexandrc#03.08.2008 15:23
+
-
edit
 

Balancer

администратор
★★★★★
Alexandrc> А без вывода на экран и в цикле, чтобы среднее время за, скажем, сотню раз?

Вывод там не влияет. А с сотней измерений погрешность будет хуже. Машина-то многозадачная :) Вечно будет что-то в фоне отрабатывать. Когда же быстро считает - есть шанс, что за время обсчёта ничего лишнего не проскочет. Исключение - очень быстрое вычисление, когда время стартапа становится актуальным.

Alexandrc> З.Ы. Ром, список собственных сообщений можно хронологически упорядочить?

В Alexandrc: Все сообщения ? Вроде, по хронологии всё.
   
RU Alexandrc #03.08.2008 17:03
+
-
edit
 

Alexandrc

аксакал

Может быть, но я при обработке, например, баз, вывод сообщений, особенно через GDI, стараюсь убрать. Экономия 2 часов из 16-ти того стоит ;) Приоритетами у задач рулить можно?

З.Ы. Вот тут Alexandrc: темы с участием за месяц
   
1 2 3 4 5

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