koffi中文
  • KOFFI
  • koffi性能
  • 中文更新日志
  • 安装需求
  • 开始使用
  • 函数调用
  • 输入参数
  • 数据指针
  • 输出参数
  • 多态参数
  • Union数据
  • 导出的变量
  • JAVASCRIPT 回调
  • 杂项
  • 构建工具和koffi
  • 贡献
  • 变更日志
  • 迁移指南
Powered by GitBook
On this page
  • 概述
  • LINUX X86_64
  • rand results
  • atoi results
  • Raylib results
  • WINDOWS X86_64
  • rand results
  • atoi results
  • Raylib results
  • 运行基准测试

koffi性能

PreviousKOFFINext中文更新日志

Last updated 1 year ago

概述

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

  • 第一个基准基于rand()调用

  • 第二个基准基于atoi()调用

  • 第三个基准测试基于

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

LINUX X86_64

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

rand results

该测试基于对简单标准 C 函数的重复调用rand,并具有三种实现:

  • 第一个是参考,它通过 N-API 模块调用 rand,接近完美(无开销)Node.js > C FFI 实现的理论极限(预编译静态胶水代码)

  • 第二个通过 Koffi 调用 rand

  • 第三个使用官方 Node.js FFI 实现,node-ffi-napi

Benchmark
Iteration time
Relative performance
Overhead(额外开销)

rand_napi

700 ns

x1.00

(ref)

rand_koffi

1152 ns

x0.61

+64%

rand_node_ffi

32750 ns

x0.02

+4576%

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

atoi results

此测试类似于 rand 测试,但它基于atoi,它采用字符串参数。Javascript (V8) 到 C 字符串的转换相对缓慢且繁重。

Benchmark
Iteration time
Relative performance
Overhead

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 results

该基准测试使用 Raylib 中基于 CPU 的图像绘制函数。调用比以前的基准测试要重得多,因此 FFI 开销减少了。在此实现中,Koffi 与:

  • Baseline:完整的 C++ 版本代码(无 JS)

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%

WINDOWS X86_64

下面显示的结果是在 x86_64 Windows 计算机(Intel® Core™ i5-4460)上测量的。

rand results

Benchmark
Iteration time
Relative performance
Overhead

rand_napi

859 ns

x1.00

(ref)

rand_koffi

1352 ns

x0.64

+57%

rand_node_ffi

35640 ns

x0.02

+4048%

atoi results

atoi_napi

1336 ns

x1.00

(ref)

atoi_koffi

2440 ns

x0.55

+83%

atoi_node_ffi

136890 ns

x0.010

+10144%

Raylib results

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 构建的二进制文件生成的。

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

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

一切构建完毕并准备就绪后,运行

node benchmark.js

:这是使用 N-API 实现的本机包装器

node-raylib
Raylib