为什么 v8::JSON::Parse 比 NodeJS JSON::parse 慢得多?

3
我知道NodeJS是建立在V8之上的,这就是为什么当我的C++封装器绕过V8解析2MB大小的JSON文件时需要394秒,而NodeJS脚本只需要167秒。在C ++中,我使用以下方式调用解析JSON:
v8::MaybeLocal<v8::Value> jsonData = v8::JSON::Parse(isolate, v8::String::NewFromUtf8(isolate, data));
而在NodeJS中则使用 JSON.parse(data)。
此外,如果像这样在循环中调用 v8::JSON::Parse,则性能会更加下降。
for (int i = 0; i < 1000; i++) {
  v8::JSON::Parse(isolate, v8::String::NewFromUtf8(isolate, data));
}

我的内存被it技术全部占用了,而且OOM killer还杀死了我的应用程序。为什么会出现这种情况?可能是因为该函数包含了内存泄漏或者我需要释放一些东西。

非常感谢!

1个回答

1
我只打赌在纯v8使用中,“JSON::parse”返回的json会立即被销毁,而在node.js中,它会异步地进行垃圾回收,或者在循环外进行垃圾回收。尝试将返回的json分块存储在一个保留的向量中,看看性能是否提高。

谢谢你的回答。"尝试将返回的JSON数据块划分到一个保留的向量中,看看性能是否提高。" 我不太明白你的意思。 - Eduard Bondarenko
看起来是全方位的问题。 在C++中,如果没有释放内存,会导致巨大的内存消耗。但在NodeJS中,内存会不断地被释放。 你可能对垃圾回收机制及其工作原理有所了解,但在我的情况下,似乎需要手动调用C++中的GC以释放JSON数据。 - Eduard Bondarenko
如果我在look函数内添加v8::HandleScope scope(isolate);,它将正常工作。for (int i = 0; i < 10000; i++) {v8::HandleScope scope(isolate); v8::MaybeLocal jsonData = v8::JSON::Parse(context, v8::String::NewFromUtf8(isolate, data)); } - Eduard Bondarenko
它显然不能在循环内部进行垃圾收集,因为handlecontext不在循环内。 - xaxxon
好的,但为什么NodeJS要快那么多呢?这是GC的问题吗? - Eduard Bondarenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接