0

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

v8 配置文件

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;
 }
4

1 回答 1

0

如果你不做任何多线程,你永远不需要接触 v8::Locker。但是,一旦你这样做了,那么你几乎必须在任何地方都有它。

v8::Locker 是为了阻止来自同一个 v8::Isolate 的多个 v8::Context 同时运行。

如果您想要多个同时执行的线程,则必须在不同的隔离中创建每个上下文。

于 2016-09-16T05:16:46.547 回答