在JDK11上GraalVM的JavaScript效能是Nashorn的兩倍
GraalVM是一個執行時平臺,它支援Java和其他基於Java位元組碼的語言,但也支援其他語言,如JavaScript,Ruby,Python或LLVM。我們堅信,正如我們目前所知,它是語言虛擬機器的未來。
但是,我們知道從已建立的Oracle JVM或OpenJDK切換到GraalVM是一個大膽的步驟,您可能不想完全採用它。但是,您可能希望在庫存JVM上嘗試GraalVM專案的一些很酷的功能。
在這篇部落格文章中,我們將展示如何從示例Maven應用程式中使用GraalVM的JavaScript引擎。我們還展示瞭如何在OpenJDK 11庫存中使用GraalVM的JavaScript引擎,包括Graal作為JIT(即時)編譯器以獲得更好的峰值效能。這樣,GraalVM的JavaScript引擎可以用作已棄用的Nashorn JavaScript引擎的替代品。我們將在Maven應用程式上進行演示,因為Maven central上提供了所有必需的工件。
GraalVM的JavaScript和Graal編譯器
可能出現的一個問題是:GraalVM的JavaScript引擎與Graal的關係是什麼; 我可以只使用JavaScript引擎並省略Graal嗎?
如果你這樣做,事情就會完全奏效。然後,您可以解析並執行任何(有效的)JavaScript程式碼。GraalVM的JavaScript引擎是一個適用於任何Java 8+實現的Java應用程式。JavaScript執行是圍繞抽象語法樹(AST)直譯器構建的,可以像任何其他Java應用程式一樣執行。每個Java虛擬機器都會在一定程度上對其進行優化,但JavaScript執行仍將被解釋,因此速度很慢。
但是,Graal編譯器有一些特殊的技巧可以將這個AST直譯器轉換為高度優化的機器程式碼。它將適應所執行的JavaScript應用程式,並將應用程式和直譯器編譯為機器程式碼,從而在執行時將其有效地轉換為JavaScript編譯器。在短暫的預熱階段之後,如果在啟用了Graal編譯器的JVM上執行GraalVM的JavaScript引擎,則JavaScript應用程式將實現接近本機的效能。
示例應用
我們準備了一個展示相關設定的示例應用程式。這個基於Maven的示例可以作為一個起點,使您能夠將基於Nashorn的JavaScript應用程式傳輸到GraalVM的帶有Graal支援的JavaScript。
該示例以JavaScript中的Prime數計算為中心,在Java程式碼中消費呼叫它。它展示瞭如何使用首選org.graalvm.polyglot介面訪問GraalVM的JavaScript ,還使用javax.script(JSR 223 ScriptEngine)介面。此外,示例程式碼通過Nashorn引擎上的ScriptEngine執行(如果可用)。執行相同數量的預熱和測量迭代並作為簡單基準列印,顯示相應引擎上所需的執行時間(較低的值更好)。
這個例子可以在GitHub上找到:
https://github.com/graalvm/graal-js-jdk11-maven-demo
請注意,程式碼的特殊優點不是討論的有趣部分,通常可以將Java和JavaScript源分成單獨的檔案等等。此示例主要關注用於執行多語言Java和JavaScript程式碼的基礎結構。如果使用以下命令編譯並執行它,應用程式應該是開箱即用的; 確保您使用JDK11 JAVA_HOME指向它。
export JAVA_HOME = / path / to / JDK11 mvn clean && mvn <b>package</b> && mvn exec:exec @ graal
這將確保您使用Graal進行GraalVM JavaScript程式碼的JIT編譯。在這個應用程式中,當我們測量時,GraalVM的JavaScript大約是Nashorn的兩倍 (請試試你的機器,YMMV)。
為了便於比較,您可以在不啟用Graal編譯的情況下執行相同的基準測試:
mvn clean && mvn package && mvn exec:exec @nograal
在該模式下,在沒有Graal作為JIT編譯器的情況下執行,GraalVM / JavaScript的效能顯著下降。
一些技術見解
現場背後發生了什麼?在pom.xml檔案中聲明瞭相關包的幾個依賴項,包括org.graalvm.compiler和org.graalvm.js。這些可以在Maven中心獲得,並從那裡下載。
將三個引數傳遞給JVM,如外掛配置部分中所宣告的,它在JVM上啟用Graal編譯:
-XX:+UnlockExperimentalVMOptions
此標誌啟用以下選項
-XX:+EnableJVMCI
通過JVMCI(Java虛擬機器編譯器介面)實現Java程式碼的編譯
--upgrade-module-path
在模組路徑上放置正確版本的Graal,以便它可以用作GraalVM / JavaScript的編譯器
結論
在這篇文章中,我們研究瞭如何從Maven Central中使用GraalVM的JavaScript引擎工件並在庫存JDK上執行它。如果不能訪問Graal編譯器,則此設定中的JavaScript程式碼效能可能不是最佳的 - 幸運的是,您可以使用一堆命令列選項啟用Graal編譯器,並獲得更快的JavaScript執行速度。在Graal編譯器的存在下,GraalVM的JavaScript明顯快於Nashorn。