koffi性能
Last updated
Last updated
以下是 Koffi 调用在三个基准测试中的执行时间的快速概述,其中与理论上理想的 FFI 实现(使用预编译的静态 N-API 粘合代码近似)进行了比较:
第一个基准基于rand()
调用
第二个基准基于atoi()
调用
第三个基准测试基于Raylib
下面详细说明了这些结果,并与 node-ffi/node-ffi-napi 进行了比较。
下面显示的结果是在x86_64 Linux 机器(Intel® Core™ i5-4460)上测量的。
该测试基于对简单标准 C 函数的重复调用rand
,并具有三种实现:
第一个是参考,它通过 N-API 模块调用 rand,接近完美(无开销)Node.js > C FFI 实现的理论极限(预编译静态胶水代码)
第二个通过 Koffi 调用 rand
第三个使用官方 Node.js FFI 实现,node-ffi-napi
rand_napi
700 ns
x1.00
(ref)
rand_koffi
1152 ns
x0.61
+64%
rand_node_ffi
32750 ns
x0.02
+4576%
由于 rand 是一个非常小的函数,因此 FFI 开销清晰可见。
此测试类似于 rand 测试,但它基于atoi
,它采用字符串参数。Javascript (V8) 到 C 字符串的转换相对缓慢且繁重。
atoi_napi
1028 ns
x1.00
(ref)
atoi_koffi
1730 ns
x0.59
+68%
atoi_node_ffi
121670 ns
x0.008
+11738%
由于 atoi 是一个非常小的函数,因此 FFI 开销清晰可见。
该基准测试使用 Raylib 中基于 CPU 的图像绘制函数。调用比以前的基准测试要重得多,因此 FFI 开销减少了。在此实现中,Koffi 与:
Baseline:完整的 C++ 版本代码(无 JS)
node-raylib:这是使用 N-API 实现的本机包装器
raylib_cc
18.5 µs
x1.42
-30%
raylib_node_raylib
26.3 µs
x1.00
(ref)
raylib_koffi
28.0 µs
x0.94
+6%
raylib_node_ffi
87.0 µs
x0.30
+230%
下面显示的结果是在 x86_64 Windows 计算机(Intel® Core™ i5-4460)上测量的。
rand_napi
859 ns
x1.00
(ref)
rand_koffi
1352 ns
x0.64
+57%
rand_node_ffi
35640 ns
x0.02
+4048%
atoi_napi
1336 ns
x1.00
(ref)
atoi_koffi
2440 ns
x0.55
+83%
atoi_node_ffi
136890 ns
x0.010
+10144%
raylib_cc
18.2 µs
x1.50
-33%
raylib_node_raylib
27.3 µs
x1.00
(ref)
raylib_koffi
29.8 µs
x0.92
+9%
raylib_node_ffi
96.3 µs
x0.28
+253%
请注意,此页面上的所有基准测试结果都是使用 Clang 构建的二进制文件生成的。
一切构建完毕并准备就绪后,运行