ストックJDKでのGraalVM JavaScriptの実行
GraalVM JavaScriptは、GraalVMの一部として、またはGraalVMでビルドされた埋込みシナリオでの実行に最適化されています。これにより、最適化コンパイラとしてGraalVMコンパイラを使用し、場合によってはネイティブ・イメージを使用してエンジンをネイティブ・バイナリに事前にコンパイルすることで、可能な最善のパフォーマンスが保証されます。
GraalVM JavaScriptはJavaアプリケーションであるため、OpenJDKなどのストックJava VMで実行できます。Graalコンパイラを使用しないで実行すると、JavaScriptのパフォーマンスは大幅に低下します。ストックJVMで使用可能なJITコンパイラは、GraalVM JavaScriptコードベースを実行およびJITコンパイルできますが、可能な最大限のパフォーマンスを引き出すように最適化することはできません。このドキュメントでは、ストックJava VMでGraalVM JavaScriptを実行する方法について説明し、どのようにGraalVMコンパイラをJITコンパイラとして使用して可能な最善のパフォーマンスを保証できるかを示します。
Maven CentralでのGraalVM JavaScript
GraalVM JavaScriptはオープン・ソースであり、コミュニティによってMaven Centralリポジトリに定期的にプッシュされます。org.graalvm.polyglot:js
に、POMアーティファクトとして置かれています。
これには、Graalコンパイラを使用したJDK 21 (またはそれ以降)上のGraalVM JavaScriptのサンプルのMavenプロジェクトがあります:
- ポリグロット埋込みのデモ。単純なJavaScript "Hello World"アプリケーションのサンプルのMavenおよびGradleプロジェクト。
- JS Mavenのデモ。このサンプルには、JavaScriptベンチマーク用のMavenプロジェクト(素数ジェネレータ)が含まれています。これにより、ユーザーは最適化コンパイラとしてGraalVMコンパイラを使用した場合と使用しない場合で、実行されたGraalVM JavaScriptのパフォーマンスを比較できます。GraalVMコンパイラを使用して実行すると、比較的大規模なJavaScriptコードベースの実行パフォーマンスが大幅に向上します。
基本的に、サンプルのpom.xml
ファイルでは、JVMコンパイラ・インタフェース(JVMCI)をアクティブ化し、--module-path
および--upgrade-module-path
にそれを指定して、JITコンパイラがGraalVMコンパイラとなるように構成します。
ScriptEngine JSR 223
js-scriptengine.jarがモジュール・パスに含まれている場合は、ScriptEngine
を介してGraalVM JavaScriptを起動できます。このエンジンにより、Graal.js
、js
、JavaScript
、javascript
など、複数の異なる名前で登録されます。Nashornエンジンがモジュール・パスに存在する場合は、このエンジンもその名前で使用可能です。
ScriptEngine
からGraalVM JavaScriptを起動するには、次のコードを使用できます:
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メソッドがGraalVMコンパイラによってコンパイルされるたびにデバッグ出力を有効にします。実行時間が十分に長い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