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

Простейшие тесты сравнения производительности Ruby 1.9.3 и 2.0.0

Простейшие тесты сравнения производительности Ruby 1.9.3 и 2.0.0. Написал сам уже давно эти тесты для сравнения скорости выполнения программ PHP и Ruby, сейчас вот сравнил версии Ruby. Кстати, PHP 5.3 уже тогда проиграл в скорости версии Ruby 1.9.2, что послужило одной из причин моего перехода с PHP на Ruby.

Устанавливаю следующие версии и так же сравниваю производительность. На данный момент версия Ruby 2.1.4 (x64).

Потом переустановил на том же сервере 64-разрядную ОС и провел те же тесты.

1. Вызов метода


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

 

Ruby 1.9.3-p392 :

       user     system      total        real
 29000000
  2.340000   0.000000   2.340000 (  2.340813)
 118000000
  4.680000   0.000000   4.680000 (  4.673924)
 267000000
  6.970000   0.010000   6.980000 (  6.990008)

 

Ruby 2.0.0-p0 :

       user     system      total        real
 29000000
  1.700000   0.000000   1.700000 (  1.703561)
 118000000
  3.400000   0.010000   3.410000 (  3.402568)
 267000000
  5.110000   0.000000   5.110000 (  5.105329)

 

Ruby 1.9.3-p392 (x64) :

       user     system      total        real
 29000000
  1.460000   0.000000   1.460000 (  1.459462)
 118000000
  2.920000   0.000000   2.920000 (  2.922716)
 267000000
  4.820000   0.000000   4.820000 (  4.828876)

 

Ruby 2.0.0-p0 (x64) :

       user     system      total        real
 29000000
  1.250000   0.010000   1.260000 (  1.256906)
 118000000
  2.500000   0.010000   2.510000 (  2.509461)
 267000000
  4.200000   0.000000   4.200000 (  4.196685)

 

Ruby 2.1.4p265 (x64) :

       user     system      total        real
 29000000
  1.200000   0.030000   1.230000 (  1.246212)
 118000000
  2.440000   0.000000   2.440000 (  2.446849)
 267000000
  4.020000   0.020000   4.040000 (  4.031445)

 

2. Фибоначчи (рекурсия)


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

 

Ruby 1.9.3-p392 :

       user     system      total        real
 832040
  0.500000   0.000000   0.500000 (  0.505144)
 1346269
  0.810000   0.000000   0.810000 (  0.809832)
 2178309
  1.310000   0.000000   1.310000 (  1.315848)
 3524578
  2.140000   0.010000   2.150000 (  2.139249)
 5702887
  3.410000   0.000000   3.410000 (  3.406315)

 

Ruby 2.0.0-p0 :

       user     system      total        real
 832040
  0.370000   0.000000   0.370000 (  0.363178)
 1346269
  0.590000   0.000000   0.590000 (  0.586127)
 2178309
  0.940000   0.000000   0.940000 (  0.949176)
 3524578
  1.530000   0.000000   1.530000 (  1.533464)
 5702887
  2.480000   0.010000   2.490000 (  2.489571)

 

Ruby 1.9.3-p392 (x64) :

       user     system      total        real
 832040
  0.300000   0.000000   0.300000 (  0.300621)
 1346269
  0.480000   0.000000   0.480000 (  0.488991)
 2178309
  0.790000   0.000000   0.790000 (  0.786796)
 3524578
  1.270000   0.000000   1.270000 (  1.268819)
 5702887
  2.060000   0.000000   2.060000 (  2.054842)

 

Ruby 2.0.0-p0 (x64) :

       user     system      total        real
 832040
  0.240000   0.000000   0.240000 (  0.240370)
 1346269
  0.390000   0.000000   0.390000 (  0.390780)
 2178309
  0.630000   0.000000   0.630000 (  0.632879)
 3524578
  1.030000   0.000000   1.030000 (  1.027106)
 5702887
  1.660000   0.000000   1.660000 (  1.659642)

 

Ruby 2.1.4p265 (x64) :

       user     system      total        real
 832040
  0.260000   0.000000   0.260000 (  0.261923)
 1346269
  0.430000   0.000000   0.430000 (  0.427672)
 2178309
  0.690000   0.000000   0.690000 (  0.694653)
 3524578
  1.130000   0.000000   1.130000 (  1.217978)
 5702887
  1.830000   0.000000   1.830000 (  1.835765)

 

Бесконечная рекурсия ;-) (gif-ролик)

 

Вывод: Ruby 2.0.0 стал значительно быстрее Ruby 1.9.3 - при проверке на 32-разрядной ОС - ~36% - 37%, на 64-разрядной - ~15% - 20%. Если учесть, что оптимизирован и require, то приложения Ruby on Rails будут выполнятся намного быстрее, по крайней мере первоначальная загрузка уж точно.

Еще более значительный прирост производительности был получен на том же самом компьютере, но с 64-разрадной ОС. В общем, при переходе с Ruby 1.9.3 (32) на Ruby 2.0.0 (64) и с 32-разрядной на 64-разрядную ОС я получил очень значительное увеличение производительности Ruby - в 2 (!) раза.

И, кстати, PHP 5.4 проигрывает Ruby 2 в производительности на этих тестах уже примерно в 2 раза - проверено на 64-разрядной ОС.

Разочарую также и тех, кто использует Python: Python 2.7.3 медленнее Ruby 2.0.0 примерно в 2 раза на тесте Фибоначчи и в 4 раза на тесте вызове метода объекта (64-разрядная ОС). Переписывая код на python, еще раз убедился, что синтаксис этого языка программирования мне совсем не подходит - обозначение блоков кода с помощью отступов и двоеточий - это не для меня - факт, в этом смысле даже PHP выглядит гораздо приятнее. Я понимаю, что дело вкуса, а больше привычки, но нет никакого желания к такому анахронизму привыкать.

Многие склонны больше доверять тестам более авторитетных источников. Но верны ли тесты там, стоит ли им так безоговорочно доверять?

"По многочисленным просьбам телезрителей" провел более сложный тест сравнения производительности Ruby 2 и PHP 5.4, где PHP все же проиграл, что нисколько не удивило меня.

Для еще более значительного увеличения производительности Ruby возможна оптимизация критичных в скорости алгоритмов с помощью движка V8.

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