Когда вызовы функций через внешний интерфейс быстрее нативных вызовов C
Дэвид Ю на GitHub разработал интересный тест производительности для вызовов функций через разные внешние интерфейсы (Foreign Function Interfaces, FFI).
Он создал файл общего объекта (
.so
) с одной простой функцией C. Затем написал код для многократного вызова этой функции через каждый FFI с измерением времени.Для C «FFI» он использовал стандартную динамическую компоновку, а не
dlopen()
. Это различие очень важно, так как действительно сказывается на результатах теста. Можно спорить, насколько честно такое сравнение с фактическим FFI, но всё равно его интересно измерить.Самый удивительный результат бенчмарка — то, что FFI от LuaJIT существенно быстрее, чем C. Он примерно на 25% быстрее, чем нативный вызов C для функции общего объекта. Как смог слабо и динамически типизированный скриптовый язык обогнать в бенчмарке C? Точен ли результат?