我有以下脚本:
var rnd = 0;
function test(){
rnd += dummy();
}
for(i = 0; i < 10000000; i++)
test();
log(rnd);
rnd = 0;
日志在终端上打印一些内容。 dummy是一个返回随机数的c ++回调函数:
void dummy(const v8::FunctionCallbackInfo<v8::Value> &args)
{
args.GetReturnValue().Set(rand() % 10);
}
在v8中编译和运行它的时间是828毫秒
之后,我从test中获取c ++中的函数句柄,并以相同的量循环调用它。这需要2195毫秒。
为什么这么慢,是否有可能让它更快?
C ++ Snipped:
auto global = context->Global();
auto function = v8::Local<v8::Function>::Cast(global->Get(v8::String::New("test")));
auto start = chrono::high_resolution_clock::now();
for(size_t i = 0; i < 10000000; i++) {
function->Call(global, 0, 0);
}
auto milli = chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start);
cout << "time: " << milli.count() << endl;
答案 0 :(得分:1)
答案很简单 - 在JS / C ++代码之间切换很慢。
当您从JavaScript调用C ++代码时,V8必须执行行程JS代码(test
函数) - &gt; C ++代码(dummy function
) - &gt; JS代码(回到test
函数)
当您调用从C ++代码调用C ++代码的JavaScript时,V8必须执行以下操作:C ++代码 - &gt; JS代码(test
函数) - &gt; C ++代码(dummy function
) - &gt; JS代码(回到test
函数) - &gt; C ++代码。