我正在使用V8执行一些自定义的javascript代码,将OnUpdate函数暴露给JS世界。总体而言,代码运行良好,但目前我担心以下代码的性能-执行任何用户定义的函数是否需要获取v8::Locker?Instruments.app显示代码在v8::Locker构造函数和析构函数中花费了太多时间-

90ms(在实际代码执行中)与~4000ms (由Locker &~Locker编写)--这很荒谬,我觉得我可能做错了什么。
所以我的基本问题是,执行v8::Function::Call真的需要抓取v8::Locker吗?在当前状态下,如果我注释掉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;
}发布于 2016-09-16 13:16:47
如果你不做任何多线程,你永远不需要接触v8::Locker。不过,一旦你这样做了,你就必须把它放在几乎所有的地方。
一个v8::Locker用于阻止来自同一个v8::Isolate的多个V8::Context同时运行。
如果您希望同时执行多个线程,则必须在不同的隔离中创建每个上下文。
https://stackoverflow.com/questions/38031703
复制相似问题