v8:为什么函数调用在javascript中更快,因为来自c ++的函数调用

时间:2014-02-14 08:21:59

标签: javascript c++ performance v8

我有以下脚本:

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;

1 个答案:

答案 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 ++代码。