開発中の、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 インタプリタ(構文木を実行)
結果・・・なでしこ3(GO)は、同じ仕組みのなでしこ1よりは、1.8倍速いが、なでしこ3(nodejs)よりも、5.3倍も遅い。

メモ - テスト環境 : 仮想マシン上のWindowsで検証 *

  • Windows10 [Parallels] on macOS(Catalina)
  • CPU: 1.6 GHz デュアルコアIntel Core i5 (メモリ16GB)

ちなみに、仮想マシン上ではなくて、ネイティブ環境で実行すると...

$ 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)
結果: 0.18s user 0.04s system 94% cpu 0.224 total

Python3.7.4の場合:

def fib(n):
    if n < 2: return n
    return fib(n-2)+fib(n-1)

print(fib(30))

結果:

0.40s user 0.07s system 95% cpu 0.489 total

これから最適化して、せめて、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