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

Другие вопросы по тегам