我正在使用 V8 执行一些自定义 javascript 代码,将OnUpdate
函数暴露给 JS 世界。整体代码工作正常,但目前我担心以下代码的性能 - 是否需要抓取v8::Locker
来执行任何用户定义的函数?显示这里的代码在构造函数和析构函数Instruments.app
中花费了太多时间-v8::Locker
90 毫秒(在实际代码执行中)vs ~4000 毫秒(由Locker
& ~Locker
)——这很荒谬,我觉得我可能做错了什么。
所以我的基本问题是真的有必要抓取v8::Locker
来执行v8::Function::Call
吗?在当前状态下,如果我注释掉,v8::Locker
我会收到以下错误消息:
# Fatal error in HandleScope::HandleScope
# Entering the V8 API without proper locking in place
代码片段:
int Bucket::send_doc_update_bucket(const char *msg) {
Locker locker(GetIsolate());
Isolate::Scope isolate_scope(GetIsolate());
HandleScope handle_scope(GetIsolate());
Local<Context> context = Local<Context>::New(GetIsolate(), context_);
Context::Scope context_scope(context);
TryCatch try_catch;
Local<Value> args[1];
args[0] = String::NewFromUtf8(GetIsolate(), msg);
assert(!try_catch.HasCaught());
Handle<Value> val;
if(!context->Global()->Get(context,
createUtf8String(GetIsolate(),
"OnUpdate")).ToLocal(&val) ||
!val->IsFunction()) {
return 3;
}
Handle<Function> on_doc_update = Handle<Function>::Cast(val);
on_doc_update->Call(context, context->Global(), 1, args);
if (try_catch.HasCaught()) {
//w->last_exception = ExceptionString(GetIsolate(), &try_catch);
return 2;
}
return 0;
}