Страница 1 из 1

Тесты на скорость выполнения

СообщениеДобавлено: 15.04.2011 13:08:20
devels
Здесь будут публиковаться тесты на скорость выполнения в сравнении с PHP и возможно другими языками (такими как Python).
Движок удалось оптимизировать под FPC, чтобы скомпилированная версия под FPC была такая же быстрая как и под delphi. В некоторых случаях, версия движка под fpc может замедляться на 10% в сравнении с delphi версией + fastmm. Здесь приведены тесты движка под delphi + fastmm. Все тесты проводились в Win32 XP. 32битная версия. Но в linux скорость будет приблизительно такая же.

1. Тест на вызов пустого метода с 4 параметрами
Intel Celeron 2.0 M (ноут).

Код: Выделить всё
class x { function my($i,$a,$b,$c){ } }

$obj = new x;
$i = 100000;
while($i--){
    $obj->my(1,1,1,1);
    $obj->my(1,1,1,1);
    $obj->my(1,1,1,1);
    $obj->my(1,1,1,1);
}

PHP 5.2 - 3600 mlsec
Orion - 2200 mlsec


2. Тест на скорость конкатенации (переменная $i приводится к int)
Код: Выделить всё
$i = 1000000;
while($i--)
   $str = $i . "test";

PHP 5.2 - 470 mlsec
Orion - 500 mlsec


3. Тест на скорость конкатенации 2 (с оператором ".=")
Код: Выделить всё
$i = 1000000;
while($i--)
   $str .= "abcd----xyz";

PHP 5.2 - 500 mlsec
Orion - 390 mlsec


4. Тест на вызов нативных математических функций
Код: Выделить всё
$i = 1000000;
while($i--)
   $r = tan(sin(cos($i)));

PHP 5.2 - 1250 mlsec
Orion - 850 mlsec


5. Тест на вызов пользовательской функции без параметров
Код: Выделить всё
function test(){ }
$i = 300000;
while($i--){
   test();test();test();test();
}

PHP 5.2 - 500 mlsec
Orion - 300 mlsec

6. Тест на вызов пользовательской функции с 6 параметрами
Код: Выделить всё
function test($x,$y,$z,$a,$b,$c){ }
$i = 300000;
while($i--){
   test(1,1,1,1,1,1);
}

PHP 5.2 - 680 mlsec
Orion - 260 mlsec
Orion FPC - 360 mlsec


7. Тест на пустой цикл for
Код: Выделить всё
for($i=0; $i<1000000; $i++){ }

PHP 5.2 - 100 mlsec
Orion - 170 mlsec


8. Создание объекта и чиста мусора
Код: Выделить всё
class X { }
$i = 1000000;
while($i--)
    $obj = new X;

PHP 5.2 - 1060 mlsec
Orion - 850 mlsec


9. Создание массива и чистка мусора
Код: Выделить всё
$i = 1000000;
while($i--)
    $arr = array(1,2,3);

PHP 5.2 - 800 mlsec
Orion - 2200 mlsec
Orion FPC - 3900 mlsec

10. Создание списка массивов
Код: Выделить всё
$i = 30000;
while($i--)
    $arr[] = array(1,2,3,4,5,6,7,8,9,10);

PHP 5.2 - 100 mlsec
Orion - 250 mlsec
Orion FPC - 400 mlsec

11. Доступ к полям объекта
Код: Выделить всё
class My { var $x = 10; }

$i = 1000000;
$obj = new My;
while ($i--){
    $d =  $obj->x + $obj->x + $obj->x;
}

PHP 5.2 - 600 mlsec
Orion - 800 mlsec


12. Доступ к статическим полям класса
Код: Выделить всё
class My { static $x = 1; }

$i = 1000000;
while ($i--){
   My::$x = My::$x + My::$x + My::$x;
   My::$x = 0;
}

PHP 5.2 - 2500 mlsec
Orion - 1200 mlsec


13. Доступ к константам
Код: Выделить всё
define('MY_X', 10);
define('MY_Y', 20);
define('MY_Z', 40);

$i = 1000000;
while ($i--){
   $d = MY_X + MY_Y + MY_Z + MY_X + MY_Y + MY_Z;
}

PHP 5.2 - 700 mlsec
Orion - 440 mlsec

Добавлено спустя 2 часа 26 минут 32 секунды:
14. Доступ к константам класса
Код: Выделить всё
class z { const MY_Z = 1; }
class y extends z { const MY_Y = 2; }
class x extends y { const MY_X = 3; }

$i = 300000;
while ($i--){
    x::MY_X + x::MY_Y + x::MY_Z +
    x::MY_X + x::MY_Y + x::MY_Z;
}

PHP 5.2 - 450 mlsec
Orion - 390 mlsec

Добавлено спустя 6 минут 6 секунд:
15. Вызов статического метода класса
Код: Выделить всё
class X {
   static function test($i,$i,$i){
   
   }
}

$i = 300000;
while($i--){
  X::test(1,1,1);
  X::test(3.1,2.1,1.1);
  X::test(false,null,true);
}

PHP 5.2 - 1450 mlsec
Orion - 800 mlsec

Добавлено спустя 13 минут:
16. Числа фибоначи, тестирование рекурсии
Код: Выделить всё
function fibo($n){
    if ($n < 2){
      return 1;
    } else {
      return fibo($n - 2) + fibo($n - 1);
    }
}

$n = 32;
echo fibo($n);

PHP 5.2 - 7700 mlsec
Orion - 5250 mlsec

Добавлено спустя 29 минут 25 секунд:
Orion и PascalScript, что быстрее?

1. Цикл от 0 до 1000000
Код: Выделить всё
var
  i: integer;
begin
  for i:=0 to 1000000 do
  begin
  end;
end.

Код: Выделить всё
for($i=0; $i<1000000; $i++){ }


PascalScript - 600 mlsec
Orion - 170 mlsec

Добавлено спустя 3 минуты 38 секунд:
2. Скорость на вызов пользовательской функции
Код: Выделить всё
procedure test(x,y,z: integer);
begin
end;
var  i: integer;
begin
  for i:=0 to 100000 do
  begin
      test(i,i,i);
      test(i,i,i);
      test(i,i,i);
  end;
end.


Код: Выделить всё
function test($x,$y,$z){ }

for($i=0;$i<100000;$i++){
   test($i,$i,$i);
   test($i,$i,$i);
   test($i,$i,$i);
}


PascalScript - 450 mlsec
Orion - 190 mlsec

Добавлено спустя 7 минут 19 секунд:
Тест скорости операторов + - * / =

Код: Выделить всё
$z = 0;
$x = 0;
for($i=1;$i<100000;$i++){
   $x = $i + 2;
   $z = ($x * 5) / $i;
}

Код: Выделить всё
var
  i: integer;
  x, z: integer;
begin
  z := 0;
  x := 0;
  for i:=1 to 100000 do
  begin
     x := i + 2;
     z := (x * 5) / i; 
  end;
end.


PascalScript - 360 mlsec
Orion - 60 mlsec (6x быстрее)

Re: Тесты на скорость выполнения

СообщениеДобавлено: 16.04.2011 09:02:04
stikriz
На самом деле это тест опримизаторов на предмет исключения неиспользываемого кода.
Кстита, в паскале было вкючено оптимизировать по скорости?
В общем, ни о чем тест.

Re: Тесты на скорость выполнения

СообщениеДобавлено: 16.04.2011 09:16:42
devels
stikriz писал(а):На самом деле это тест опримизаторов на предмет исключения неиспользываемого кода.
Кстита, в паскале было вкючено оптимизировать по скорости?
В общем, ни о чем тест.


Мертвый код в php и orion'e не обрезается, оптимизации тоже нет, это информация 1000 раз проверенная. Поэтому тесты вполне актуальные.

Дебаг информация была отключена в настройках PascalScript, никакой опции для оптимизации я там не нашел, качал последнюю версию. Но как видно по тестам, мертвый код в PascalScript также не обрезается и даже возможно нет оптимизации для константных выражений.

Re: Тесты на скорость выполнения

СообщениеДобавлено: 17.04.2011 22:50:14
devels
11. Доступ к полям объекта

Удалось оптимизировать этот момент, теперь доступ к полям объекта (в том числе и методам) стал такой же быстрый как в php.