• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用 code cache 加速编译
2
3## code cache 简介
4
5JSVM 提供了生成并使用 code cache 加速编译过程的方法, 其获取和使用分为下面几个部分:
6
7- 首先使用 compile 系列接口编译得到 JSVM_Script
8- 使用 OH_JSVM_CreateCodeCache 接口, 传入编译完成后生成的 JSVM_Script
9- 将 OH_JSVM_CreateCodeCache 生成的 code cache 保存, 等待下一次编译时, 作为参数传递给 compile 系列接口
10
11通过上述流程, 将会在使用 code cache 的那次编译中, 极大减少编译时间, 其原理为将编译完成的 script 序列化, 然后使用 code cache 编译时就不再需要重新解析/编译已经被序列化的函数, 只需要进行一次反序列化即可, 编译就简化为了一次数据读取。
12
13## 场景示例
14
15下面的伪代码是一个典型的使用方法, 其中第二次编译, 如果 cacheRejected 的值没有被置为 true, 那么说明 code cache 使用成功, 这次运行将会极大加快。
16
17其中使用到的 JSVM-API 可以参考 [JSVM-API 简介](../reference/common/_j_s_v_m.md), 这里仅展示调用的步骤。
18
19```c++
20
21JSVM_Env env;
22
23...
24
25using namespace std;
26static string src = R"JS(
27const concat = (...args) => args.reduce((a, b) => a + b);
28throw new Error("exception triggered")
29)JS";
30
31// 编译参数准备
32JSVM_Value jsSrc;
33JSVM_Script script;
34size_t length = 0;
35const uint8_t* dataPtr = nullptr,
36bool cacheRejected = false;
37
38// 生成 code cache
39{
40	JSVM_HandleScope handleScope;
41	OH_JSVM_OpenHandleScope(env, &handleScope);
42
43	// 源码字符串转换为 js 字符串
44	OH_JSVM_CreateStringUtf8(env, src.c_str(), src.size(), &jsSrc);
45
46	// 编译js代码
47	OH_JSVM_CompileScript(env, jsSrc, nullptr, 0, true, nullptr, &script);
48
49	// 执行js代码
50	JSVM_Value result;
51	OH_JSVM_RunScript(env, script, &result);
52
53	if (dataPtr && lengthPtr && *dataPtr == nullptr) {
54	    // 将js源码编译出的脚本保存到 cache, 可以避免重复编译, 带来性能提升
55	    OH_JSVM_CreateCodeCache(env, script, dataPtr, lengthPtr);
56	}
57
58	OH_JSVM_CloseHandleScope(env, handleScope);
59}
60
61// 使用 code cache
62{
63	JSVM_HandleScope handleScope;
64	OH_JSVM_OpenHandleScope(env, &handleScope);
65
66	// 源码字符串转换为 js 字符串
67	OH_JSVM_CreateStringUtf8(env, src.c_str(), src.size(), &jsSrc);
68
69	// 使用 code cache 编译js代码
70	OH_JSVM_CompileScript(env, jsSrc, dataPtr, length, true, &cacheRejected, &script);
71
72	// 执行js代码
73	JSVM_Value result;
74	OH_JSVM_RunScript(env, script, &result);
75
76	OH_JSVM_CloseHandleScope(env, handleScope);
77}
78```
79