Time: 60 minutes | Level: Architect | Docker:docker run -it --rm node:20-alpine sh
Native addons let Node.js call C/C++ code directly, unlocking SIMD, hardware I/O, legacy libraries, and extreme performance. This lab covers N-API with node-addon-api, node-gyp compilation, and FFI as an alternative.
// file: fib.c
#include <node_api.h>
long long fibonacci(int n) {
if (n <= 1) return n;
long long a = 0, b = 1, temp;
for (int i = 2; i <= n; i++) {
temp = a + b;
a = b;
b = temp;
}
return b;
}
napi_value NativeFib(napi_env env, napi_callback_info info) {
size_t argc = 1;
napi_value args[1];
napi_get_cb_info(env, info, &argc, args, NULL, NULL);
int32_t n;
napi_get_value_int32(env, args[0], &n);
long long result = fibonacci(n);
napi_value ret;
napi_create_int64(env, result, &ret);
return ret;
}
napi_value Init(napi_env env, napi_value exports) {
napi_value fn;
napi_create_function(env, "fib", NAPI_AUTO_LENGTH, NativeFib, NULL, &fn);
napi_set_named_property(env, exports, "fib", fn);
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
// file: benchmark.js
const addon = require('./build/Release/fib.node');
// JS implementation
function jsFib(n) {
if (n <= 1) return n;
let a = 0, b = 1;
for (let i = 2; i <= n; i++) { const t = a + b; a = b; b = t; }
return b;
}
const N = 50;
const ITER = 1_000_000;
console.time('JS fib(50) x1M');
for (let i = 0; i < ITER; i++) jsFib(N);
console.timeEnd('JS fib(50) x1M');
console.time('Native fib(50) x1M');
for (let i = 0; i < ITER; i++) addon.fib(N);
console.timeEnd('Native fib(50) x1M');
console.log(`fib(50) = ${addon.fib(N)}`);