2013-05-14 2 views
0

Я использую такой код:Как прекомпилировать код SpiderMonkey для более быстрого выполнения?

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

назвать go_back(), который уже в context. Но это очень медленно, и я думаю, потому что строка должна быть скомпилирована каждый раз.

Я пытаюсь найти способ вызова одного и того же фрагмента кода многократно быстрым способом без перекомпиляции или создания какого-либо объекта каждый раз. Но документы и источники Mozilla не организованы таким образом, есть только ссылка, и вам нужно знать каждую функцию, прежде чем вы сможете сделать любой выбор.

Значит, любые намеки? Какая была бы лучшая практика для этого?

+1

Вы можете использовать вызовы XDR для сериализации ваших скомпилированных байт-кодов (объекта JSScript) в файл. Когда вам нужно снова выполнить байт-коды, создайте объект JSScript, прочитав из сохраненного изображения. Таким образом вы избегаете повторной компиляции. Но простой сценарий, подобный твоему, не должен занять слишком много времени для компиляции! – JavaMan

ответ

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() может иногда терпеть неудачу.

Смежные вопросы