Как прекомпилировать код SpiderMonkey для более быстрого выполнения?
Я использую такой код:
JS_EvaluateScript(context, global,"go_back('blabla')", 17, "", 1, &R);
звонить go_back()
, который уже находится в context
, Но это очень медленно, и я думаю, потому что строка должна быть скомпилирована каждый раз.
Я пытаюсь найти способ вызвать один и тот же фрагмент кода много раз быстро, без перекомпиляции или создания какого-либо объекта каждый раз. Но документы и источники Mozilla организованы таким образом, здесь есть только ссылки, и вам нужно знать каждую функцию, прежде чем вы сможете сделать какой-либо выбор.
Так какие-нибудь намеки? Какова будет лучшая практика для этого?
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;
}
Это очень быстро (20 раз в моем примере), по сравнению с JS_EvaluateScript
, Обратите внимание, что этот код очень упрощен, вам все равно нужно передать string
аргумент как-то. (Я сам не уверен, как это сделать.) И вам может понадобиться JS_ReportPendingException()
как go_back()
иногда может потерпеть неудачу.