V8可以执行JS代码的构建时预编译吗?



我们正在努力优化手机端JS代码的启动时间,并寻找机会。我发现Facebook的Hermes JS引擎也是为了类似的目的而创建的,但我们目前严重依赖于V8。

构建时预编译可以用V8完成意味着解析和代码优化将在编译时完成,并在运行时节省一些时间?从源代码生成LLVM位码并在运行时执行位码似乎非常接近我的想象。WASM似乎不是一个选择(至少在移动设备上)。

如果可能的话,可以提供一个简单的例子,琐碎的JS代码优化与V8?

p。也许它还有助于内存消耗,这可能是次要目标。

为了这个目的,

V8支持堆快照。例如,Atom编辑器使用它来改进启动时间。它不是关于预编译,而是关于预构建全局环境和实例化函数(可能尚未编译,只是转换为Ignition的字节码,这就足够了)。如果你使用的是Electron,mksnapshotnpm包可能会很有用。(如果没有,看看它是如何工作的可能仍然是有用的。)

我没有做过任何V8黑客,但是他们从上面的博客文章中链接的例子如下:

TEST(PerIsolateSnapshotBlobs) {
DisableTurbofan();
const char* source1 = "function f() { return 42; }";
const char* source2 =
"function f() { return g() * 2; }"
"function g() { return 43; }"
"/./.test('a')";
v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1);
v8::StartupData data2 = v8::V8::CreateSnapshotDataBlob(source2);
v8::Isolate::CreateParams params1;
params1.snapshot_blob = &data1;
params1.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate1 = v8::Isolate::New(params1);
{
v8::Isolate::Scope i_scope(isolate1);
v8::HandleScope h_scope(isolate1);
v8::Local<v8::Context> context = v8::Context::New(isolate1);
delete[] data1.data;  // We can dispose of the snapshot blob now.
v8::Context::Scope c_scope(context);
CHECK_EQ(42, CompileRun("f()")->ToInt32(isolate1)->Int32Value());
CHECK(CompileRun("this.g")->IsUndefined());
}
isolate1->Dispose();
v8::Isolate::CreateParams params2;
params2.snapshot_blob = &data2;
params2.array_buffer_allocator = CcTest::array_buffer_allocator();
v8::Isolate* isolate2 = v8::Isolate::New(params2);
{
v8::Isolate::Scope i_scope(isolate2);
v8::HandleScope h_scope(isolate2);
v8::Local<v8::Context> context = v8::Context::New(isolate2);
delete[] data2.data;  // We can dispose of the snapshot blob now.
v8::Context::Scope c_scope(context);
CHECK_EQ(86, CompileRun("f()")->ToInt32(isolate2)->Int32Value());
CHECK_EQ(43, CompileRun("g()")->ToInt32(isolate2)->Int32Value());
}
isolate2->Dispose();
}

那篇博客文章(和相关的例子?)是2015年的,所以事情可能已经发生了变化。

相关内容

最新更新