2016-10-08 9 views
0

私はNodeJSがV8の上に構築されていることを知っています。そのため、v8のC++ラッパーがjsonファイル(2 Mb)を394秒で解析し、NodeJSスクリプトが同じjsonファイルを167秒で解析すると、それは非常に奇妙に見えます。 Cではv8からJSON :: Parseをなぜv8からNodeJS JSON :: parseよりもずっと遅くするのですか?

++私は、このよう

v8::MaybeLocal<v8::Value> jsonData = v8::JSON::Parse(isolate, v8::String::NewFromUtf8(isolate, data));

とNodeJS JSON.parse(data)内で解析JSONを呼び出します。

はまた、私はこの

for (int i = 0; i < 1000; i++) { 
    v8::JSON::Parse(isolate, v8::String::NewFromUtf8(isolate, data)); 
} 

それはすべて私の記憶を食べ、OOMキラーは私のアプリを殺すようにループ内でv8::JSON::Parseを呼び出すとき。それがなぜこのように機能するのですか?おそらく、この関数にmemのリークが含まれているか、何かを解放する必要があります。

多くの感謝!

答えて

1

純粋なv8の使用では、JSON :: parseから返されたjsonはすぐに破棄されますが、node.jsではループ外でもガベージコレクションでも非同期で収集されます。返されたjsonsを再生ベクトルでチャンクして、パフォーマンスが上がるかどうか確認してください。

+0

あなたの答えはThxです。 "返されたjsonsを再描画されたベクトルでチャンクして、パフォーマンスが上がるかどうかを確認してください。"私はそれが何を意味するのかを正確に理解していません。 –

+0

まるで周りのように見えます。 C++の場合、無料で大量のメモリを消費します。しかし、NodeJSの場合、メモリは絶えず解放されます。 あなたはおそらくGCについて正しいかもしれませんが、動作しますが、私の場合のように、私はGCをC++で手動で呼び出してjsonデータを解放する必要があります。 –

+0

v8 :: HandleScopeスコープを追加すると(分離);内部の見た目はうまくいくでしょう。 for(int i = 0; i <10000; i ++){ v8 :: HandleScopeスコープ(分離); v8 :: MaybeLocal jsonData = v8 :: JSON :: Parse(context、v8 :: String :: NewFromUtf8(isolate、data)); } –