我有以下脚本:
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/