標準JDKでのGraalJSの実行

GraalJSは、主にJavaアプリケーションでの使用を推奨されるGraalVMの一部として実行するために最適化されています。これにより、Graalコンパイラを最適化コンパイラとして使用し、可能性としてはネイティブイメージを使用してエンジンを事前にネイティブバイナリにコンパイルすることで、可能な限り最高の性能が保証されます。

しかし、Oracle JDKやOpenJDKなどの標準的なJava VM上でGraalJSを実行することも可能です。Graalコンパイラなしで実行した場合、JavaScriptのパフォーマンスは大幅に低下します。標準的なJVMで使用可能なJITコンパイラはGraalJSコードベースを実行してJITコンパイルできますが、GraalJSを最大限のパフォーマンスに最適化することはできません。このドキュメントでは、標準的なJava VMでGraalJSを実行する方法と、GraalコンパイラをJITコンパイラとして使用して可能な限り最高の性能を保証する方法について説明します。

Maven Central上のGraalJS #

GraalJSはオープンソースであり、コミュニティによって定期的にMaven Centralリポジトリにプッシュされています。org.graalvm.polyglot:jsで見つけることができます。

JDK 21以降を使用し、Graalコンパイラを使用するJavaに埋め込まれたGraalJSを実行するサンプルプロジェクトを提供しています。

  • Polyglot Embedding Demo。シンプルなJavaScript「Hello World」アプリケーション用のMavenおよびGradleプロジェクトです。
  • JS Maven Demo。この例には、JavaScriptベンチマーク(素数ジェネレータ)用のMavenプロジェクトが含まれています。これにより、最適化コンパイラとしてGraalコンパイラを使用する場合と使用しない場合のGraalJSのパフォーマンスを比較できます。Graalコンパイラを使用すると、比較的大きなJavaScriptコードベースの実行パフォーマンスが大幅に向上します。基本的に、サンプルのpom.xmlファイルはJVM Compiler Interface(JVMCI)をアクティブにし、--module-path--upgrade-module-pathでGraalコンパイラを提供することで、JITコンパイラをGraalコンパイラに設定します。

ScriptEngine JSR 223 #

js-scriptengine.jarがモジュールパスに含まれている場合、GraalJSはScriptEngineを介して起動できます。このエンジンは、Graal.jsjsJavaScriptjavascriptなど、いくつかの異なる名前で登録されます。モジュールパスにある場合は、Nashornエンジンもその名前で使用できることに注意してください。

ScriptEngineからGraalJSを起動するには、次のコードを使用できます。

new ScriptEngineManager().getEngineByName("Graal.js");

利用可能なすべてのエンジンを一覧表示するには

List<ScriptEngineFactory> engines = new ScriptEngineManager().getEngineFactories();
for (ScriptEngineFactory f : engines) {
    System.out.println(f.getLanguageName() + " " + f.getEngineName() + " " + f.getNames());
}

セットアップの検査 - GraalVMコンパイラがJITコンパイラとして使用されているか? #

--engine.TraceCompilationオプションは、JavaScriptメソッドがGraalコンパイラによってコンパイルされるたびにデバッグ出力を有効にします。実行時間の十分に長いJavaScriptソースコードは、コンパイルをトリガーし、ログ出力を印刷します。

> function add(a,b) { return a+b; }; for (var i=0;i<1000*1000;i++) { add(i,i); }
[truffle] opt done         add <opt> <split-c0875dd>                                   |ASTSize       7/    7 |Time    99(  90+9   )ms |DirectCallNodes I    0/D    0 |GraalNodes    22/   71 |CodeSize          274 |CodeAddress 0x7f76e4c1fe10 |Source    <shell>:1:1

お問い合わせ