@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

いろいろなRubyでπを計算して速さを比べる

計測用のスクリプト

require "bigdecimal"
require "benchmark"

Benchmark.bmbm do |x|
  x.report do
    prec = 100
    conv = 3
    a = BigDecimal("1")
    b = BigDecimal("1") / BigDecimal("2").sqrt(prec)
    t = BigDecimal("1") / 4
    p = BigDecimal("1")
  
    for n in 1..conv do
      an = (a + b) / 2
      b = (a * b).sqrt(prec)
      t -= p * (an - a) * (an - a)
      p *= 2
      a = an
    end
  end
end

jRubyJITの影響を受けるっぽいので、bmbmを使っています。 リハーサル実効時にJITコンパイルされたら、本番時にはJITコンパイル後の速度が測れるだろうという目測です。 本当にそうなのかは確証はありません。

概要

Ruby実装 計算時間(秒)
CRuby 3.1.2 0.004
TruffleRuby 22.0+ GraalVM 0.19
TruffleRuby 22.0 0.26
jRuby 9.3.7 1.29

CRubyが圧倒的に速いです。 Benchmarking CRuby, MJIT, YJIT, JRuby and TruffleRuby · On the Edge of Ruby などで見かけるベンチマークと違います。 あまりにもマイクロなベンチマークなので上手く計測出来ていないのでしょうか? JITが有効になるには、もっとたくさんの実行回数が必要なのでしょうか?

詳細

CRuby 3.1.2

ledsun@MSI:~/ruby-pi►rbenv local 3.1.2
ledsun@MSI:~/ruby-pi►ruby --version
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
ledsun@MSI:~/ruby-pi►ruby pi.rb
Rehearsal ------------------------------------
   0.003965   0.000793   0.004758 (  0.004761)
--------------------------- total: 0.004758sec

       user     system      total        real
   0.004151   0.000000   0.004151 (  0.004136)

jRuby 9.3.7

ledsun@MSI:~/ruby-pi►rbenv local jruby-9.3.7.0
ledsun@MSI:~/ruby-pi►ruby --version
jruby 9.3.7.0 (2.6.8) 2022-08-16 c79ef237e0 OpenJDK 64-Bit Server VM 11.0.16+8-post-Ubuntu-0ubuntu120.04 on 11.0.16+8-post-Ubuntu-0ubuntu120.04 +jit [x86_64-linux]
ledsun@MSI:~/ruby-pi►ruby pi.rb
Rehearsal ------------------------------------
   3.830000   0.040000   3.870000 (  1.706857)
--------------------------- total: 3.870000sec

       user     system      total        real
   1.910000   0.020000   1.930000 (  1.291241)

truffleruby 22.2

ledsun@MSI:~/ruby-pi►rbenv local truffleruby-22.2.0
ledsun@MSI:~/ruby-pi►ruby --version
truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE Native [x86_64-linux]
ledsun@MSI:~/ruby-pi►ruby pi.rb
Rehearsal ------------------------------------
   1.303417   0.046385   1.349802 (  0.421265)
--------------------------- total: 1.349802sec

       user     system      total        real
   0.887849   0.029376   0.917225 (  0.263987)

truffleruby 22.2 + GraalVM

ledsun@MSI:~/ruby-pi►rbenv local truffleruby+graalvm-22.2.0
ledsun@MSI:~/ruby-pi►ruby --version
truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE Native [x86_64-linux]
ledsun@MSI:~/ruby-pi►ruby pi.rb
Rehearsal ------------------------------------
   1.382144   0.022365   1.404509 (  0.421443)
--------------------------- total: 1.404509sec

       user     system      total        real
   0.606478   0.028106   0.634584 (  0.190170)