以下是 Koffi 调用在三个基准测试中的执行时间的快速概述,其中将其与理论上的理想 FFI 实现(用预编译的静态 N-API 胶水代码近似)进行了比较:
rand() 调用atoi() 调用这些结果在下方详细说明并解释,并与 node-ffi/node-ffi-napi 进行了比较。
以下结果是在我的 x86_64 Linux 机器(Intel® Core™ i5-4460)上测量的。
该测试围绕对标准 C 函数 rand 的重复调用展开,包含三种实现:
| 基准测试 | 迭代时间 | 相对性能 | 开销 |
|---|---|---|---|
| rand_napi | 700 ns | x1.00 | (参考) |
| rand_koffi | 1152 ns | x0.61 | +64% |
| randnodeffi | 32750 ns | x0.02 | +4576% |
由于 rand 是一个非常小的函数,因此 FFI 开销清晰可见。
该测试与 rand 测试类似,但基于 atoi,它接受一个字符串参数。从 Javascript(V8)到 C 的字符串转换相对较慢且繁重。
| 基准测试 | 迭代时间 | 相对性能 | 开销 |
|---|---|---|---|
| atoi_napi | 1028 ns | x1.00 | (参考) |
| atoi_koffi | 1730 ns | x0.59 | +68% |
| atoinodeffi | 121670 ns | x0.008 | +11738% |
由于 atoi 是一个非常小的函数,因此 FFI 开销清晰可见。
该基准测试使用 Raylib 中基于 CPU 的图像绘制功能。这些调用比前面基准测试中的调用要重得多,因此 FFI 开销有所减少。在此实现中,Koffi 与以下内容进行了比较:
| 基准测试 | 迭代时间 | 相对性能 | 开销 |
|---|---|---|---|
| raylib_cc | 18.5 µs | x1.42 | -30% |
| raylibnoderaylib | 26.3 µs | x1.00 | (参考) |
| raylib_koffi | 28.0 µs | x0.94 | +6% |
| raylibnodeffi | 87.0 µs | x0.30 | +230% |
以下结果是在我的 x86_64 Windows 机器(Intel® Core™ i5-4460)上测量的。
该测试围绕对标准 C 函数 rand 的重复调用展开,包含三种实现:
| 基准测试 | 迭代时间 | 相对性能 | 开销 |
|---|---|---|---|
| rand_napi | 859 ns | x1.00 | (参考) |
| rand_koffi | 1352 ns | x0.64 | +57% |
| randnodeffi | 35640 ns | x0.02 | +4048% |
由于 rand 是一个非常小的函数,因此 FFI 开销清晰可见。
该测试与 rand 测试类似,但基于 atoi,它接受一个字符串参数。从 Javascript(V8)到 C 的字符串转换相对较慢且繁重。
以下结果是在我的 x86_64 Windows 机器(Intel® Core™ i5-4460)上测量的:
| 基准测试 | 迭代时间 | 相对性能 | 开销 |
|---|---|---|---|
| atoi_napi | 1336 ns | x1.00 | (参考) |
| atoi_koffi | 2440 ns | x0.55 | +83% |
| atoinodeffi | 136890 ns | x0.010 | +10144% |
由于 atoi 是一个非常小的函数,因此 FFI 开销清晰可见。
该基准测试使用 Raylib 中基于 CPU 的图像绘制功能。这些调用比 atoi 基准测试中的调用要重得多,因此 FFI 开销有所减少。在此实现中,Koffi 与以下内容进行了比较:
| 基准测试 | 迭代时间 | 相对性能 | 开销 |
|---|---|---|---|
| raylib_cc | 18.2 µs | x1.50 | -33% |
| raylibnoderaylib | 27.3 µs | x1.00 | (参考) |
| raylib_koffi | 29.8 µs | x0.92 | +9% |
| raylibnodeffi | 96.3 µs | x0.28 | +253% |
请注意,此页面上的所有基准测试结果都是使用 Clang 构建的二进制文件制作的。
一旦一切构建完成并准备就绪,运行: