#c #v8 #persistent
#c #v8 #постоянная
Вопрос:
Могу ли я каким-то образом сохранять v8::Isolate::Scope
v8::HandleScope
и v8::Context::Scope
?
Я знаю, что могу создать постоянную контекстную v8::Persistent<v8::Context, v8::CopyablePersistentTraits<v8::Context>> pContext(isolate, v8::Context::New(isolate, nullptr, global));
и постоянную функцию, но могу ли я на самом деле сохранить все области, перечисленные выше?
Чтобы я мог исключить переменные стека областей, подобные этому:
v8::Isolate::Scope isolate_scope(isolate); // can I persist isolate_scope ?
v8::HandleScope scope(isolate); // can I persist handlescope ?
v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);
global->Set(v8::String::NewFromUtf8(isolate, "print"), v8::FunctionTemplate::New(isolate, Print));
global->Set(v8::String::NewFromUtf8(isolate, "require"), v8::FunctionTemplate::New(isolate, Require));
v8::Persistent<v8::Context, v8::CopyablePersistentTraits<v8::Context>> pContext(isolate, v8::Context::New(isolate, nullptr, global));
v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, pContext);
v8::Context::Scope context_scope(context); // can I persist this ?
Большое спасибо.
Комментарии:
1. Я не понимаю вашего вопроса, но вот некоторая общая информация: A
v8::Local
— это ссылка, которая исчезает, когда исчезает ее handlescope. Av8::Global
(предположительно, что вы имеете в виду постоянный) остается до тех пор, пока глобальная переменная не вызовет свой деструктор или::Reset(...)
. Обычно создаетсяGlobal<Context>
, поскольку это единственный способ поместить его в структуру данных, чтобы сохранить контекст, чтобы потом с ним что-то делать.2. Кроме того,
v8::Local<v8::ObjectTemplate> global
это ужасное имя.3. Хорошо. Я попытаюсь немного прояснить. Внутри моей оболочки c у меня есть две функции: компиляция и запуск. Сначала создайте изолированную, создайте области видимости, скомпилируйте, запустите и сохраните постоянную функцию. И второе включение, run function , пытается получить ту же изоляцию, создать области видимости и просто запустить эту уже скомпилированную функцию. bitbucket.org/bondarenkoedik/v8final/src v8wrap.cpp функции file, _run и _compile. Итак, вопрос в том, почему версия nodejs работает быстрее. Проблема в GC? Потому что в моей версии, если я вызываю _run в цикле, я постоянно выделяю и удаляю память, и это может быть так.
4. Я ничего не знаю о вашей узловой программе, чтобы рассказать вам, в чем может быть разница.
5. Я не использую cnode.cpp для проведения тестов. Я просто вызываю run из нескольких потоков внутри моей тестовой простой программы.