Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Первоуральск

Сравнение производительности Ruby, PHP и Python на Linux x64 Intel Core i5

27.04.2015

Тесты на производительность (скорость выполнения) программ на Ruby 2 (2.2.2), PHP (5.6.7) и Python (2.7.9). Тесты совершенно простые.

В экспериментах использую конфигурацию Intel Core i5 3Ггц, 4Гб RAM, Linux x64.

Совершенно очевидно, что Ruby - абсолютный лидер по скорости выполнения программ! Скорость выполнения превосходит в разы! Cравнивались только сходные языки программирования, скриптовые.

Тест 1

Ruby

require "benchmark"

class A
  def a(val)
    val * 3
  end
end

Benchmark.bm do | make |

  i = 1

  a_obj = A.new

  3.times do

    make.report {

      sum = -1_000_000 * i

      count = 10_000_000 * i

      while (count -= 1) >= 0
         sum += a_obj.a(i)
      end

      puts "#{sum}"

    }

    i+=1

  end

end

 

PHP

class A {
   public function a_func($val) {
      return  $val * 3;
   }
}

$a_obj = new A();

for ($p = 1; $p < 4; $p++) {

   $time = microtime(true);

   $sum = -1000000 * $p;

   $count = 10000000 * $p;

   for ($i = 0; $i < $count; $i++) {

      $sum += $a_obj->a_func($p);

   }

   print "$sum\t" . (microtime(true)-$time) . "\n";
}

 

Python

import time

class A:
  def a(self, val):
    return val * 3


i = 1

a_obj = A()

while (i < 4):

  s = -1000000 * i
  count = 10000000 * i - 1

  start = time.time()

  while (count >= 0):
    s += a_obj.a(i)
    count -= 1

  elapsed = (time.time() - start)

  print s
  print elapsed

  i += 1

 

Тест 2 (Фибоначи)

Ruby

require "benchmark"

def fib(n)
  return n if n <= 1
  fib(n - 1) + fib(n - 2)
end

Benchmark.bm do | make |
  i = 0
  5.times do
    make.report { puts fib(30+i) }
    i += 1
  end
end

 

PHP

function fib($n) {
  if ($n <= 1) return $n;
  return fib($n - 1) + fib($n - 2);
}
for($i=0; $i<5; $i++) {
  $t = microtime(true);
  print fib(30+$i) . "\n";
  print(microtime(true)-$t)."\n";
}

 

Python

import time

def fib(n):
  if (n <= 1):
    return n
  return fib(n - 1) + fib(n - 2)

i = 0
while (i<5):
  start = time.time()
  print fib(30 + i)
  elapsed = (time.time() - start)
  print elapsed
  i += 1

 

 

Результаты

Тест 1

Ruby

       user     system      total        real
 29000000
  0.630000   0.010000   0.640000 (  0.643333)
 118000000
  1.310000   0.010000   1.320000 (  1.313236)
 267000000
  1.940000   0.000000   1.940000 (  1.939470)

 

PHP

29000000        1.3855249881744
118000000       2.6716480255127
267000000       4.0066411495209

 

Python

29000000
2.55204916
118000000
4.97329282761
267000000
7.52163100243

 

Тест 2

Ruby

       user     system      total        real
 832040
  0.140000   0.000000   0.140000 (  0.141629)
 1346269
  0.220000   0.000000   0.220000 (  0.213588)
 2178309
  0.350000   0.000000   0.350000 (  0.346973)
 3524578
  0.550000   0.000000   0.550000 (  0.558695)
 5702887
  0.910000   0.000000   0.910000 (  0.907601)

 

PHP

832040
0.32892394065857
1346269
0.51861095428467
2178309
0.83380198478699
3524578
1.3471601009369
5702887
2.1651961803436

 

Python

832040
0.2678399086
1346269
0.366957187653
2178309
0.598000049591
3524578
0.964015007019
5702887
1.56219482422