クジラ机ブログ

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

Go言語の開発環境を整える (2020-06-20)

golangの開発環境。

vim-go *

VSCode *

いつも$GOPATHの設定の仕方を忘れてしまう。ワークスペースに『.vscode/settings.json』という名前のファイルを作成して、以下を記述。

{
  "go.gopath": "/Users/hoge/xxx/nadesiko3go",
  "go.formatOnSave": true
}

だが、いろいろ試してみて、みんながやっているように、GOPATHを$HOME/goに設定するのが一番トラブルがないので、いつものソースコードのフォルダへシンボリックリンクを張って、素直に$HOME/go以下でコードを管理することにした。そうしたら、direnvとか余分な設定要らないし。

VIMカスタマイズ (2020-05-16)

vimをよく使っていろいろ編集しているのですが、最近キーカスタマイズにはまっているので紹介。

karabinerと組み合わせる場合 *

テスト的に、Karabinerを利用。インストールはHomebrewで。インストールしたら、アクセシビリティとか変更の必要あり。

brew cask install karabiner-elements

jkで挿入モードを抜ける *

.vimrcに以下を記述。また念のため<C-j>にも割り当てる。

" ESCキーの代わり
inoremap jk <ESC>
imap <C-j> <esc>
noremap! <C-j> <esc>

Leaderキーにいろいろ割り当てる *

こちらも、.vimrcに書きます。ここでは、Leaderをスペースキーに割り当てています。Leaderキーの機能は、キーの組み合わせではなくて、連続でキーを押すことで実行できるショートカットのようなもの。

let mapleader = "\<Space>"

そして、もろもろの機能を割り当て。

" 二回スペースキーを押すとビジュアルモードに。
nmap <Leader><Leader> V
" [スペース]とwで保存
nnoremap <Leader>w :w<CR>
" クリップボードのアクセスも
vmap <Leader>y "+y
vmap <Leader>d "+d
nmap <Leader>p "+p
nmap <Leader>P "+P
vmap <Leader>p "+p
vmap <Leader>P "+P

あとは、vim-goでビルドと実行を割当てると便利。vim-goのチュートリアルに書いてあるやつだけど。

autocmd FileType go nmap <leader>b  <Plug>(go-build)
autocmd FileType go nmap <leader>r  <Plug>(go-run)

挿入モードでカーソル移動 *

英数キーと組み合わせなければ、karabiner使わなくてもできます。

" 挿入モード時、Ctrlキーでhjklで移動
inoremap <C-h> <Left>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-l> <Right>
cnoremap <C-h> <Left>
cnoremap <C-j> <Down>
cnoremap <C-k> <Up>
cnoremap <C-l> <Right>