これはなに?
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 を特別扱いしている感じがよく分かる。

