#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?