说的不是node-gyp,虽然这个也很有意思,但是我更看好WebAssembly——一种全新的胶水,用来从各种语言嫁接到 Javascript 并且在前端大放异彩的今天提供性能更强大,实现更优雅的选择。(很多时候Javascript的实现方式只能说“野蛮”)
算是探索WebAssembly的开胃菜吧。

参考资料 WebAssembly-MDN

举个\(O(n^2)\)的例子测试以下编译后的性能:

/*test.cpp*/
#include <time.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
	clock_t start, end;
	double result = 2;
	int size = 20000;
	start = clock();
	for (int i = 0; i < size; ++i)
	{
		for (int j = 0; j < size; ++j)
		{
			result += 2;
		}
	}
	end = clock();
	printf("%lf\n", result);
	printf("%lf\n", (double)(end - start)/CLOCKS_PER_SEC);
}

把上面的代码编译成js,只需要emcc test.cpp -s WASM=1,目录下就会出现一个 js 文件和一个 wasm 文件。node out.js,输出类似这样:
2018-06-29 20-59-13屏幕截图.png

可见在c++中计算大概用了500ms。使用同样结构的 js 代码对比一下:

var size = 20000;
var result = 2;
var start = Date.now();
for(var i = 0; i < size; i++){
	for(var j = 0; j < size; j++){
		result += 2;
	}
}
var end = Date.now();
console.log(result);
console.log(end - start);

运行结果:
2018-06-29 20-59-54屏幕截图.png

oops,大概是400ms,emmmm.....看来在简单的计算上,粗暴的移植到c++并不能提升什么性能(废话,V8不要面子的吗)。WebAssembly的宝藏还有待挖掘...