ゼロからはじめるGo言語の素材 (2021-12-09)

2020/07/20/技術書を出版するとき注意すること (2020-08-02)

筆者は30冊以上技術書を書いています。さっき履歴を見たら2003年から17年以上、2008年以降は年に2-3冊ペースで書いています。それで、これから技術書を書いてみたい人にポイントをおさえたアドバイスを紹介します。

とても、このブログ記事が好評だったので、有料noteにして公開します。ご興味があれば、noteで見てください。

筆者の近著 *

ちなみに、今年に入って筆者が出版した本は以下の三冊です。いずれも、面白い力作揃いなので見てみてください!

2020/05/28なでしこ3Goの完成度 (2020-07-14)

開発中の、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