Ruby の FFI によるメソッド呼び出しのオーバーヘッド

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 を書くことができれば半分くらいのオーバーヘッドで処理を回せそう。