FFI を利用して C のライブラリを呼び出す時のオーバーヘッドがどれくらいなのかと思い調べてみました。
使用したコード
呼び出し時のオーバーヘッドを知りたかったので、処理負荷がかからない単純に加算するだけのコードとしました。
int add(int x, int y) { return x + y; }
使用したコード一式は https://github.com/Watson1978/ffi-benchmark にあるので、興味がある方はそちらを参照ください。macOS 上でしか試してないので、他の環境だと動かないかもしれません。あしからず。
環境
- macOS 13.1
- Apple M1 Max
- Apple clang version 14.0.0 (clang-1400.0.29.202)
- ruby 3.2.0 (2022-12-25 revision a528908271) [arm64-darwin22]
ベンチマーク結果
Warming up -------------------------------------- FFI 858.752k i/100ms Native 1.637M i/100ms Calculating ------------------------------------- FFI 8.639M (± 0.3%) i/s - 43.796M in 5.069555s Native 16.306M (± 0.2%) i/s - 81.842M in 5.019252s
C 言語で直接 bridge を書くことができれば半分くらいのオーバーヘッドで処理を回せそう。