2016-06-25 5 views
0

내가 JS 세계로 OnUpdate 기능을 노출, 자바 스크립트 코드 일부 사용자 지정을 실행하는 V8을 사용하고 있습니다. 전체 코드는 정상적으로 작동하지만 현재는 아래 코드의 성능에 대해 우려하고 있습니다. 사용자 정의 함수를 실행하기 위해 v8::Locker을 잡아야합니까? Instruments.app 코드는 여기 v8::Locker 생성자와 소멸자에 너무 많은 시간을 보낸다 보여줍니다 -v8 :: Function :: Call을 만들기 전에 v8 :: Locker를 가져와야합니까?

v8 profile

( Locker & ~Locker에 의해) ~의 4000ms 대 (실제 코드 실행에서)

90 MS -이 말도하고 내가 수도 느낌 뭔가 잘못하고있는 것.

그래서 내 기본적인 질문은 그것이 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; 
} 
+1

코드에 어떤 종류의 멀티 스레딩이있는 경우, 자주 잠금 API는 다른 스레드가 보유하고있을 때 스레드가 실행되는 것을 차단하기 때문에 높은 사용량을 얻습니다. 비싸지 만 자신의 작업을 수행하고 있기 때문이 아닙니다. – Yakk

+0

Yakk, I 귀하의 요점을 이해하십시오 - 그러나 그것이 여기에 해당되는지 확실하지 않습니다. 이 경우,'v8 :: Locker'는'v8 :: Isolate' 인스턴스에 바인드되어'v8 :: Context'를 사용하여 여러개의 병렬 코드를 실행할 수 있습니다. 그러나 저는 v8을 사용하고 있다고 믿습니다 - 오직 하나의 컨텍스트 만 실행 중입니다 분리 된 당. repo에 연결 - https://github.com/abhi-bit/eventing/ – Abhi

+0

실제로 스레드를 전환 할 때 v8 :: Locker 객체 만 만들고 파괴해야합니다. 항상 동일한 OS 스레드에서 V8 격리를 액세스하는 경우 사물함을 만들고 오랫동안 활성 상태로 둘 수 있습니다. 나는 GetIsolate는()도 여전히 상당히 비싼 전화라고 생각합니다, 당신은 당신이 그것을 여러 번 호출하는 경우 지역 변수에 결과를 캐시 할 수 있습니다. –

답변

0

어떤 멀티 스레딩을 수행하지 않는 경우, 당신은 V8 :: 사물함을 터치 할 필요가 없습니다합니다. 당신이하는대로, 그럼, 당신은 거의 모든 곳에서 그것을 가지고있다.

V-8 : 로커는 여러 V8 :: 문맥의이 같은 V8에서 중지 :: 분리를 동시에 실행할 수 있습니다.

당신이 실행 여러 개의 동시 스레드를 원하는 경우

, 각 컨텍스트는 다른 분리에 작성해야합니다.