Нашорн CompiledScript Graalvm эквивалент - PullRequest
0 голосов
/ 26 ноября 2018

У меня довольно большой файл, который нужно часто оценивать,

с помощью nashorn. Я делал что-то подобное:

CompiledScript compiledScript = ((Compilable) engine).compile(text);

и позже я мог звонить много разследующее:

Context context = new SimpleScriptContext();
compiledScript.eval(context);

это было довольно быстро.

Используя новый API Polyglot, я делаю:

Source source = Source.newBuilder("js", myFile).build();

затем:

Context context = Context.newBuilder("js").option("js.nashorn-compat", "true").build();
context.eval(source)

Используя jmh, у меня большая разница в производительности между двумя

Benchmark                     Mode  Cnt   Score    Error  Units
JmhBenchmark.testEvalGraal    avgt    5  42,855 ± 11,118  ms/op
JmhBenchmark.testEvalNashorn  avgt    5   2,739 ±  1,101  ms/op

Если я выполняю eval в одном и том же контексте, он работает правильно, но я не хочу иметь общий доступконтекст между двумя последовательными eval (если концепция контекста Грааля не совпадает с концепцией Нэшорна).

1 Ответ

0 голосов
/ 28 ноября 2018

Чтобы воспроизвести настройку ScriptEngine с GraalVM, вы должны повторно использовать тот же Engine (org.graalvm.polyglot.Engine) и .close() контекст после использования:

Source source = Source.newBuilder("js", myFile).build();
Engine engine = Engine.create();

и более поздние:

Context context = Context.newBuilder("js")
                         .engine(engine)
                         .option("js.nashorn-compat", "true").build();
context.eval(source);
context.close();

Цитирование Context.Builder.engine документации :

Явно устанавливает базовый механизм для использования.По умолчанию каждый контекст имеет свой собственный изолированный движок.Если из одного механизма создается несколько контекстов, они могут совместно использовать / кэшировать определенные системные ресурсы, такие как AST или оптимизированный код, указав один базовый механизм.

...