@ledsun blog

無味の味は佳境に入らざればすなわち知れず

jRubyでπを計算する

Rubyでπを計算する - @ledsun blog でπを計算するRubyスクリプトが動くことがわかりました。 WSLにjRubyをインストールしてみる - @ledsun blog で設定したjRubyで動かしてみます。

ledsun@MSI:~/ruby-pi►rbenv local jruby-9.3.7.0
ledsun@MSI:~/ruby-pi►ruby pi.rb

まるっきり終わりません。

このスクリプトガウス=ルジャンドルのアルゴリズム - Wikipedia を採用しています。 計算を繰り返す回数を増やすと求められるπの桁数が増えます。 スクリプト中のconv変数が繰返す回数を指定しています。 つまりアルゴリズムを変更せずに計算時間が調整できるパラメーターです。 この値を調整してためしてみます。

jRuby

1

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 0.027010284014977515s

2

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 0.2614899040199816s

3

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 1.905935324029997s

4

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 31.895614359993488s

こんなふうに計算時間がふえることあるのでしょうか? アルゴリズム再帰していません。

GCでしょうか? ガタガタになるしても線形に増えそうなものです。 そもそもこの程度のオブジェクト数でGCが走るのでしょうか?

Ruby 3.1.2

Ruby 3.1.2でも試してみます。

ledsun@MSI:~/ruby-pi►rbenv local 3.1.2

1

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 0.00016911199782043695s

2

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 0.00015715498011559248s

3

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 0.004318212973885238s

4

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 0.007067304977681488s

5

ledsun@MSI:~/ruby-pi►ruby pi.rb
Time: 0.1696732720010914s

あ、これ求める桁数が増えると線形以上に計算時間が増えるもんなんですね。 単に jRubyRuby 3.1 の200倍遅いのでしょうか?