cgoでC言語の関数を呼び出す場合、普通の関数呼び出しの10倍くらいコストがかかりますね。ffiと同じくらいと見ればいいのかな? もっとかかってるのかも。
例えばこんな感じにしておいて、、、
MBPで試してみると、こんな感じでした。
BenchmarkCSin-4 20000000 106 ns/op BenchmarkSin-4 100000000 22.8 ns/op BenchmarkMSin-4 100000000 20.0 ns/op
cgoを使って呼び出すことで5倍のコストがかかる。あとGolangの中で関数呼び出しが1段増えるだけだと3ns程度しか増えないのね。ライブラリ関数の呼び出しは内部関数の10倍、cgoはさらにその5倍…とかいう話なのかなこれは。
Golangはテストコードの中で直接cgoを使うことができない、という制約もあります。最初はxxx_test.goをいきなり作って、そこでcgoを使おうと思ったんですけど…直接cgoで書けないので、main.goを書く羽目になりました。
Golangで処理時間の短いC言語のライブラリを呼ぶのは得策ではなく、移植した方が良いだろうって話。
これ、お試しで xxHash(高速なハッシュ関数)のライブラリを呼び出してみようと https://github.com/wtnb75/go-xxhash を作りかけたんですが、試してみると標準ライブラリにあるCRCやAdlerに比べてあまりに遅いのでどうなんだろう…と思ったらcgoが遅かったと。そういう話です。