基准

预计阅读时间: 6 分钟

源文档 - Benchmarks

概述

以下是 Koffi 调用在三个基准测试中的执行时间的快速概述,其中将其与理论上的理想 FFI 实现(用预编译的静态 N-API 胶水代码近似)进行了比较:

  • 第一个基准测试基于 rand() 调用
  • 第二个基准测试基于 atoi() 调用
  • 第三个基准测试基于 Raylib

这些结果在下方详细说明并解释,并与 node-ffi/node-ffi-napi 进行了比较。

Linux x86_64

以下结果是在我的 x86_64 Linux 机器(Intel® Core™ i5-4460)上测量的。

rand 测试结果

该测试围绕对标准 C 函数 rand 的重复调用展开,包含三种实现:

  • 第一种是参考实现,它通过 N-API 模块调用 rand,接近于完美(无开销)的 Node.js > C FFI 实现的理论极限(预编译的静态胶水代码)
  • 第二种通过 Koffi 调用 rand
  • 第三种使用官方的 Node.js FFI 实现,即 node-ffi-napi
基准测试迭代时间相对性能开销
rand_napi700 nsx1.00(参考)
rand_koffi1152 nsx0.61+64%
randnodeffi32750 nsx0.02+4576%

由于 rand 是一个非常小的函数,因此 FFI 开销清晰可见。

atoi 测试结果

该测试与 rand 测试类似,但基于 atoi,它接受一个字符串参数。从 Javascript(V8)到 C 的字符串转换相对较慢且繁重。

基准测试迭代时间相对性能开销
atoi_napi1028 nsx1.00(参考)
atoi_koffi1730 nsx0.59+68%
atoinodeffi121670 nsx0.008+11738%

由于 atoi 是一个非常小的函数,因此 FFI 开销清晰可见。

Raylib 测试结果

该基准测试使用 Raylib 中基于 CPU 的图像绘制功能。这些调用比前面基准测试中的调用要重得多,因此 FFI 开销有所减少。在此实现中,Koffi 与以下内容进行了比较:

  • 基线:完整的 C++ 代码版本(无 JS)
  • node-raylib:这是一个用 N-API 实现的原生包装器
基准测试迭代时间相对性能开销
raylib_cc18.5 µsx1.42-30%
raylibnoderaylib26.3 µsx1.00(参考)
raylib_koffi28.0 µsx0.94+6%
raylibnodeffi87.0 µsx0.30+230%

Windows x86_64

以下结果是在我的 x86_64 Windows 机器(Intel® Core™ i5-4460)上测量的。

rand 测试结果

该测试围绕对标准 C 函数 rand 的重复调用展开,包含三种实现:

  • 第一种是参考实现,它通过 N-API 模块调用 rand,接近于完美(无开销)的 Node.js > C FFI 实现的理论极限(预编译的静态胶水代码)
  • 第二种通过 Koffi 调用 rand
  • 第三种使用官方的 Node.js FFI 实现,即 node-ffi-napi
基准测试迭代时间相对性能开销
rand_napi859 nsx1.00(参考)
rand_koffi1352 nsx0.64+57%
randnodeffi35640 nsx0.02+4048%

由于 rand 是一个非常小的函数,因此 FFI 开销清晰可见。

atoi 测试结果

该测试与 rand 测试类似,但基于 atoi,它接受一个字符串参数。从 Javascript(V8)到 C 的字符串转换相对较慢且繁重。

以下结果是在我的 x86_64 Windows 机器(Intel® Core™ i5-4460)上测量的:

基准测试迭代时间相对性能开销
atoi_napi1336 nsx1.00(参考)
atoi_koffi2440 nsx0.55+83%
atoinodeffi136890 nsx0.010+10144%

由于 atoi 是一个非常小的函数,因此 FFI 开销清晰可见。

Raylib 测试结果

该基准测试使用 Raylib 中基于 CPU 的图像绘制功能。这些调用比 atoi 基准测试中的调用要重得多,因此 FFI 开销有所减少。在此实现中,Koffi 与以下内容进行了比较:

  • node-raylib(基线):这是一个用 N-API 实现的原生包装器
  • raylib_cc:无任何 Javascript 的基准测试的 C++ 实现
基准测试迭代时间相对性能开销
raylib_cc18.2 µsx1.50-33%
raylibnoderaylib27.3 µsx1.00(参考)
raylib_koffi29.8 µsx0.92+9%
raylibnodeffi96.3 µsx0.28+253%

运行基准测试

请注意,此页面上的所有基准测试结果都是使用 Clang 构建的二进制文件制作的。

cd koffi node ../../cnoke/cnoke.js --prefer-clang cd koffi/benchmark node ../../cnoke/cnoke.js --prefer-clang

一旦一切构建完成并准备就绪,运行:

node benchmark.js