说的不是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
,输出类似这样:
可见在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);
运行结果:
oops,大概是400ms,emmmm.....看来在简单的计算上,粗暴的移植到c++并不能提升什么性能(废话,V8不要面子的吗)。WebAssembly的宝藏还有待挖掘...