分子動力学シミュレーションコードをGoで書いてみる
はじめに
仕事でGoを時々使う。静的型付け言語で比較的動作も高速・書きやすいというのがあり重宝している。
高速と書いたが、あるアプリケーションを別々の言語で実装して速度を比較した場合、ざっくりと
C/C++, Fortran, Rust > Go > Java > Python, Ruby
みたいになるイメージを持っていたんだけども、これって本当なのかなとふと思った。
そこで、大学にいた頃にやっていた短距離古典分子動力学法のシミュレーションコードをGoで書いてみて、C++の実装と比較してみることにした。
ソースコードは以下にあげた。
比較対象としたC++の実装はkaityo256さんの以下のリポジトリのコード。
計測の条件は以下の通り
- OS: macOS Majove
- CPU: Intel(R) Core(TM) i7-4650U CPU @ 1.70GHz
- C++コンパイラ: Apple LLVM version 10.0.1 (clang-1001.0.46.4)
- Go: go version go1.11.5 darwin/amd64
- C++のコンパイルオプション
-std=c++11 -march=native -Wall -Wextra -O3
- Goの場合はコンパイルオプションに変更なし
時間がなかったので、ひとまずstep1のBrute Forceで相互作用の計算を行う場合の性能の比較だけ行なった。
結果
Go | C++ | |
---|---|---|
実行時間 | 18.43s | 19.99s |
あれ? Goの実装の方が速かった。なんかミスっている気がするな。。。 後日、真面目にプロファイリングしてみることにする。