我有一个nodejs程序,我在其中进行了大量的计算。我正在考虑让它更快,所以我决定尝试将一些代码移动到c ++。但首先我进行了快速测试,看看性能提升是否显着。
我知道在v8中调用c ++函数很昂贵,所以在我的测试中只有一个调用!
binding.gyp文件:
{
"targets": [
{
"target_name": "test",
"sources": [ "test.cc" ]
}
]
}
test.cc文件:
#include <node.h>
#include <v8.h>
#include <cstdlib>
#include <time.h>
using namespace v8;
Handle<Value> Func(const Arguments& args) {
HandleScope scope;
double sum = 0;
double x = rand() / RAND_MAX;
double y = rand() / RAND_MAX;
for (int i = 0; i < 1e9; i += 1) {
x = x / y;
y = x * rand() / RAND_MAX;
sum += x + y;
}
return scope.Close(Number::New(sum));
}
void init(Handle<Object> exports) {
srand(time(NULL));
exports->Set(String::NewSymbol("func"),
FunctionTemplate::New(Func)->GetFunction());
}
NODE_MODULE(test, init)
test.js文件:
'use strict';
var cpp = require("./build/Release/test").func;
function js() {
var sum = 0;
var x = Math.random();
var y = Math.random();
for (var i = 0; i < 1e9; i += 1) {
x = x / y;
y = x * Math.random();
sum += x + y;
}
return sum;
}
function log(msg, hrtime) {
console.log(msg, (hrtime[0] * 1e9 + hrtime[1]) * 1e-9);
}
var t = process.hrtime();
js();
log('JS', process.hrtime(t));
t = process.hrtime();
cpp();
log('CPP', process.hrtime(t));
结果:
JS 8.060747399
CPP 15.041201326000001
为什么c ++插件速度太慢?
我正在使用节点v0.10.21
答案 0 :(得分:2)
div操作是最昂贵的,与js代码相比,你使用它的次数是3次。此外,您不知道random()的实现方式。来自c ++的random()
代码可能与js中的random()
代码非常不同,所以不要做出假设。
答案 1 :(得分:2)
“在C ++中编写perf敏感部分”的想法在V8中存在缺陷。在python / php中,规范的解释器比V8编译的javascript慢10000x +慢。
如果你在编写带有perf的JS时,你将很容易达到足够快的水平。虽然编写这样的JS并不容易,因为几乎所有直观的习惯都不利于性能。