如何预编译SpiderMonkey代码以加快执行?

如何预编译SpiderMonkey代码以加快执行?,spidermonkey,Spidermonkey,我使用的代码如下: JS_EvaluateScript(context, global,"go_back('blabla')", 17, "", 1, &R); 调用已在上下文中的返回()。但是这是非常慢的,我认为这是因为每次都要编译字符串 我试图找到快速多次调用同一段代码的方法,而无需每次重新编译或创建某些对象。但是Mozilla文档和源代码不是这样组织的,只有一个参考,在做出任何选择之前,您需要了解每个函数 有什么提示吗?这方面的最佳做法是什么 JSFunction * FUNC

我使用的代码如下:

JS_EvaluateScript(context, global,"go_back('blabla')", 17, "", 1, &R);
调用已在
上下文中的
返回()
。但是这是非常慢的,我认为这是因为每次都要编译字符串

我试图找到快速多次调用同一段代码的方法,而无需每次重新编译或创建某些对象。但是Mozilla文档和源代码不是这样组织的,只有一个参考,在做出任何选择之前,您需要了解每个函数

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

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\u EvaluateScript
相比,这个速度非常快(在我的示例中是20倍)。请注意,这段代码非常简单,您仍然需要以某种方式传递
字符串
参数。(我自己也不知道该怎么做。)您可能需要
JS_ReportPendingException()
,因为
go_back()
有时会失败。

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