2013-05-14 103 views
0

我使用这样的代码:如何预编译SpiderMonkey代码以加快执行速度?

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

调用go_back(),这已经是在context。但是这非常缓慢,我想因为每次都要编译字符串。

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

因此,任何提示?最佳做法是什么?

+1

您可以使用XDR调用将编译的字节码(JSScript对象)序列化为文件。当你需要再次执行字节码时,通过读取保存的图像来创建一个JSScript对象。这样你就避免了重新编译。但像你这样简单的脚本不应该花太长时间来编译! – JavaMan 2013-12-01 13:02:53

回答

0
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; 
} 

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