2013-05-14 101 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()有時可能會失敗。