鸿蒙5.0开发进阶:NDK开发-使用 code cache 加速编译

往期鸿蒙全套实战文章必看:(文中附带全栈鸿蒙学习资料)


code cache 简介

JSVM 提供了生成并使用 code cache 加速编译过程的方法, 其获取和使用分为下面几个部分:

  • 首先使用 compile 系列接口编译得到 JSVM_Script
  • 使用 OH_JSVM_CreateCodeCache 接口, 传入编译完成后生成的 JSVM_Script
  • 将 OH_JSVM_CreateCodeCache 生成的 code cache 保存, 等待下一次编译时, 作为参数传递给 compile 系列接口

通过上述流程, 将会在使用 code cache 的那次编译中, 极大减少编译时间, 其原理为将编译完成的 script 序列化, 然后使用 code cache 编译时就不再需要重新解析/编译已经被序列化的函数, 只需要进行一次反序列化即可, 编译就简化为了一次数据读取。

场景示例

下面的伪代码是一个典型的使用方法, 其中第二次编译, 如果 cacheRejected 的值没有被置为 true, 那么说明 code cache 使用成功, 这次运行将会极大加快。

其中使用到的 JSVM-API 可以参考 JSVM-API 简介, 这里仅展示调用的步骤。

JSVM_Env env;

...

using namespace std;
static string src = R"JS(
const concat = (...args) => args.reduce((a, b) => a + b);
throw new Error("exception triggered")
)JS";

// 编译参数准备
JSVM_Value jsSrc;
JSVM_Script script;
size_t length = 0;
const uint8_t* dataPtr = nullptr,
bool cacheRejected = false;

// 生成 code cache
{
    JSVM_HandleScope handleScope;
    OH_JSVM_OpenHandleScope(env, &handleScope);

    // 源码字符串转换为 js 字符串
    OH_JSVM_CreateStringUtf8(env, src.c_str(), src.size(), &jsSrc);

    // 编译js代码
    OH_JSVM_CompileScript(env, jsSrc, nullptr, 0, true, nullptr, &script);

    // 执行js代码
    JSVM_Value result;
    OH_JSVM_RunScript(env, script, &result);

    if (dataPtr && lengthPtr && *dataPtr == nullptr) {
        // 将js源码编译出的脚本保存到 cache, 可以避免重复编译, 带来性能提升
        OH_JSVM_CreateCodeCache(env, script, dataPtr, lengthPtr);
    }

    OH_JSVM_CloseHandleScope(env, handleScope);
}

// 使用 code cache
{
    JSVM_HandleScope handleScope;
    OH_JSVM_OpenHandleScope(env, &handleScope);

    // 源码字符串转换为 js 字符串
    OH_JSVM_CreateStringUtf8(env, src.c_str(), src.size(), &jsSrc);

    // 使用 code cache 编译js代码
    OH_JSVM_CompileScript(env, jsSrc, dataPtr, length, true, &cacheRejected, &script);

    // 执行js代码
    JSVM_Value result;
    OH_JSVM_RunScript(env, script, &result);

    OH_JSVM_CloseHandleScope(env, handleScope);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值