Почему v8 :: JSON :: Parse из версии 8 намного медленнее, чем NodeJS JSON :: parse?

#javascript #c #json #node.js #v8

#javascript #c #json #node.js #v8

Вопрос:

Я знаю, что NodeJS построен поверх версии 8. Вот почему это выглядит так странно, когда моя оболочка c вокруг версии 8 анализирует файл json (2 Мб) за 394 секунды, а скрипты NodeJS анализируют тот же файл json за 167 секунд.

В C я вызываю parse 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));
}
  

это съедает всю мою память, а убийца ООМ убивает мое приложение. Почему это работает таким образом? Может быть, эта функция содержит утечки памяти или мне нужно что-то освободить.

Большое спасибо!

Ответ №1:

Я могу только поспорить, что при использовании чистого v8 json, возвращенный из ‘JSON :: parse’, сразу же уничтожается при node.js , он собирает мусор либо асинхронно, либо вне цикла. Попробуйте объединить возвращенные json-файлы в восстановленный вектор и посмотреть, повысится ли производительность.

Комментарии:

1. Спасибо за ваш ответ. «Попробуйте поместить возвращенные json в восстановленный вектор и посмотреть, повысится ли производительность». Я не совсем понимаю, что вы имеете в виду.

2. Похоже, все наоборот. В случае c мы имеем огромное потребление памяти без free. Но в случае NodeJS память постоянно освобождается. Возможно, вы правы насчет GC и когда это работает, но, похоже, в моем случае мне нужно вызвать GC на C вручную, чтобы освободить данные json.

3. Если я добавлю v8 ::HandleScope scope (изолировать); внутренний вид, он будет работать просто отлично. for (int i = 0; i < 10000; i ) { v8::HandleScope scope(изолировать); v8::MaybeLocal<v8::Value> jsonData = v8::JSON::Parse(контекст, v8::String::NewFromUtf8(изолировать, данные));}

4. очевидно, что он не может собирать мусор внутри цикла, поскольку handlecontext не находится внутри цикла

5. Хорошо, но почему NodeJS намного быстрее? Это проблема с GC?