開発中の、nadesiko3goだが、フィボナッチの計算くらい動くようになった。
なお、まだ何も最適化していない。
試したフィボナッチの計算は以下のようなソースコード。
●FIB(Nの) もし、N<2ならばNで戻る。 ((N-1)のFIB)+((N-2)のFIB)で戻る。 ここまで。 (30のFIB)を表示。
これを、なでしこ1で計測してみる。なでしこ1では「ここまで」を省略し文字コードをSJISにすると動く。
> Measure-Command{ .\cnako.exe fib.nako } TotalMilliseconds : 7675.7394
なでしこ3(node.js)ではどうか。おぉ、Node.jsのV8エンジンはすごく速いので、かなりすぐ終わる。
> Measure-Command { cnako3 fib.nako3 } TotalMilliseconds : 767.8427
そして、待望のなでしこ3Go言語版の速度は。。。
Measure-Command{ .\nadesiko3go.exe fib.nako3 } TotalMilliseconds : 4114.6627
小数点以下を切り捨てて、分かりやすく表にすると...
言語 | 実行に必要なミリ秒 | 仕組み |
なでしこ3(nodejs) | 767 | JSのコードに変換 |
なでしこ3(go) | 4114 | インタプリタ(構文木を実行) |
なでしこ1 | 7675 | インタプリタ(構文木を実行) |
ちなみに、仮想マシン上ではなくて、ネイティブ環境で実行すると...
$ time ./nadesiko3go fib.nako3 3.91s user 0.13s system 108% cpu 3.709 total $ time cnako3 fib.nako3 0.49s user 0.06s system 108% cpu 0.502 total
なでしこ3のNode.js版がGo版よりも、7.9倍速いということが分かったのだった。
V8エンジン恐るべし。
Ruby2.6の場合:
def fib(n) return n if n < 2 fib(n - 1) + fib(n - 2) end puts fib(30)
Python3.7.4の場合:
def fib(n): if n < 2: return n return fib(n-2)+fib(n-1) print(fib(30))
結果:
これから最適化して、せめて、Pythonくらい速くなるといいなぁと思っているところ。
--- nadesiko3go --- 832040 real 0m3.471s user 0m3.690s sys 0m0.141s --- perl --- 832040 real 0m0.397s user 0m0.385s sys 0m0.006s --- python --- 832040 real 0m0.413s user 0m0.348s sys 0m0.051s