これはなに?
Ruby 3.0 で x ** 2 が速くなった件 を読んで、マイクロベンチマークしたくなったのでマイクロベンチマークした。
実用性とかそういう視点には立っていない。
測定対象とか
ruby は、2.7.2 と 3.0.0-preview1。
環境は macOS Catalina 10.15.6。2.2 GHz クアッドコアIntel Core i7。
何を測るか
例えば x
の 11乗を計算するとして。
以下のような方法がある。
名前 | 計算方法 |
---|---|
x**n |
x**11 |
x*x*...*x |
x*x*x*x*x*x*x*x*x*x*x |
use variables |
z=x*x;y=x*z*z;x*y*y |
use '**2' |
((x**2)**2*x)**2*x |
最初の2つはいいとして。
use variables
は、掛け算の回数を減らす努力をまあまあした感じの計算をする。
全力で減らす努力をしたわけではないので、例えば 27 の場合は「z=x*x*x;y=z*z;z=x*y*y;x*z*z
」の7回になっている。
全力だとたぶん「z=x*x*x;y=z*z*z;y*y*y
」の6回になるんだけど、まあサボった。
最後のは、**2
をたくさん使って計算する。
x は 3.0
にした。
指数は 2〜32 を試した。
指数の値が小さいと、 x**n
と use '**2'
は同じだし、 x*x*...*x
と use variables
も同じだったりする。
結果
グラフはいずれも Iteration per second なので、上が速い。
片対数グラフ注意。
10乗ぐらいまでは use variables
が速そう。
16乗ぐらいまでは use variables
と x**n
が抜きつ抜かれつ。
それ以上は x**n
が速い。
グラフを見ると、 x**3
か x**4
ぐらいまでは特別扱いしたほうが良さげに見えるけど、どうだろう。
x**n
を見ると、 3.0.0-preview1 で **2
を特別扱いしている感じがよく分かる。