在標準 JDK 上執行 GraalJS

GraalJS 已針對作為 GraalVM 的一部分執行進行最佳化,主要建議用於 Java 應用程式中。這可透過使用 Graal 編譯器 作為最佳化編譯器,並可能使用 Native Image 將引擎提前編譯為原生二進位檔,來保證最佳效能。

然而,也可以在標準 Java VM(例如 Oracle JDK 或 OpenJDK)上執行 GraalJS。在沒有 Graal 編譯器執行時,JavaScript 的效能將會明顯較差。雖然標準 JVM 上提供的 JIT 編譯器可以執行和 JIT 編譯 GraalJS 程式碼庫,但它無法將 GraalJS 最佳化到其完整的效能潛力。本文件說明如何在標準 Java VM 上執行 GraalJS,並展示如何使用 Graal 編譯器作為 JIT 編譯器以保證最佳效能。

Maven Central 上的 GraalJS #

GraalJS 是開源的,並由社群定期推送到 Maven Central Repository。您可以在 org.graalvm.polyglot:js 下找到它。

我們提供了範例專案,在 JDK 21(或更新版本)上執行嵌入在 Java 中的 GraalJS,並使用 Graal 編譯器

  • Polyglot Embedding Demo。適用於簡單 JavaScript「Hello World」應用程式的 Maven 和 Gradle 專案。
  • JS Maven Demo。此範例包含一個用於 JavaScript 基準測試(質數產生器)的 Maven 專案。它讓使用者可以比較 GraalJS 在使用或不使用 Graal 編譯器作為最佳化編譯器時的效能。使用 Graal 編譯器執行可以顯著提高任何相對較大的 JavaScript 程式碼庫的執行效能。基本上,此範例的 pom.xml 檔案會啟用 JVM 編譯器介面 (JVMCI),並透過在 --module-path--upgrade-module-path 上提供 Graal 編譯器,將 JIT 編譯器設定為 Graal 編譯器。

ScriptEngine JSR 223 #

js-scriptengine.jar 包含在模組路徑中時,可以透過 ScriptEngine 啟動 GraalJS。該引擎會在數個不同的名稱下註冊,包括 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 編譯器? #

每當 Graal 編譯器編譯 JavaScript 方法時,--engine.TraceCompilation 選項都會啟用偵錯輸出。具有足夠長執行時間的 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

與我們聯繫