javascript - v8:为什么 javascript 中的函数调用比 C++ 中的函数调用更快

标签 javascript c++ performance v8

我有以下脚本:

var rnd = 0;
function test(){
    rnd += dummy();
}
for(i = 0; i < 10000000; i++)
    test();
log(rnd);
rnd = 0;

log 在终端上打印一些东西。 dummy 是一个返回随机数的 c++ 回调函数:

void dummy(const v8::FunctionCallbackInfo<v8::Value> &args)
{
    args.GetReturnValue().Set(rand() % 10);
}

v8编译运行时间为828毫秒

在此之后,我从测试中获取了 C++ 中的函数句柄,并在循环中以相同的数量调用它。这需要 2195 毫秒。

为什么这么慢,有没有可能让它更快?

C++ 片段:

 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;

最佳答案

答案很简单——在 JS/C++ 代码之间切换很慢。

当你从 JavaScript V8 调用 C++ 代码时,必须执行 JS 代码(test 函数)-> C++ 代码(dummy function)-> JS 代码(返回测试函数)

当你调用从 C++ 代码调用 C++ 代码的 JavaScript 时,V8 必须执行以下行程:C++ 代码 -> JS 代码(test 函数) -> C++ 代码(dummy function) -> JS代码(返回测试函数)-> C++代码。

关于javascript - v8:为什么 javascript 中的函数调用比 C++ 中的函数调用更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21774140/

相关文章:

c++ - 传递二维字符数组并赋值

c++ - OpenGL 显示空白屏幕。也许是由于着色器?

java - 小范围整数的高效映射

sql - 选择 "where clause"评估顺序

python - 如何对 numpy 数组进行采样并有效地对每个样本执行计算?

c# - 在 .net 中缩小和合并文件

javascript - 谷歌地图 var 城市 map 区域可点击

javascript - 如何使用 superagent-mock 作为临时后端

javascript - JS : Get Y Position of a String in Div

c++ - 求两个 x1,x2 之间的质数总数,找不到错误?