【问题标题】:How to precompile SpiderMonkey code for faster execution?如何预编译 SpiderMonkey 代码以加快执行速度?
【发布时间】:2013-05-14 07:39:03
【问题描述】:

我正在使用这样的代码:

JS_EvaluateScript(context, global,"go_back('blabla')", 17, "", 1, &R);

调用go_back(),它已经在context 中。但这非常慢,我认为是因为每次都必须编译字符串。

我试图找到一种方法来快速多次调用同一段代码,而不需要重新编译,或者每次都创建一些对象。但是 Mozilla 文档和资源不是这样组织的,只有一个参考,你需要知道每个功能才能做出任何选择。

所以有什么提示吗?这方面的最佳做法是什么?

【问题讨论】:

  • 您可以使用 XDR 调用将已编译的字节码(一个 JSScript 对象)序列化为文件。当您需要再次执行字节码时,通过读取保存的图像创建一个 JSScript 对象。这样可以避免重新编译。但是像你这样的简单脚本编译时间应该不会太长!

标签: spidermonkey


【解决方案1】:
JSFunction * FUNC = 0;

static JSBool my_native(JSContext *cx, uintN argc, jsval *vp) {
    jsval R = JSVAL_FALSE;
    if (FUNC == 0) {
        const char *ARGS[1] = {"s"}, *src = "go_back(s)";
        FUNC = JS_CompileFunction(cx, 0, 0, 1, ARGS, src, 10, "", 0);
    }
    JS_CallFunction(cx, 0, FUNC, 1, &R, &R);
    return JS_TRUE;
}

JS_EvaluateScript 相比,这非常快(在我的示例中为 20 倍)。请注意,此代码非常简化,您仍然需要以某种方式传递 string 参数。 (我不确定自己该怎么做。)您可能需要JS_ReportPendingException(),因为go_back() 有时会失败。

【讨论】:

    猜你喜欢
    • 2018-02-14
    • 2014-07-21
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多