為什麼在JDK11上GraalVM的JavaScript性能是Nashorn的兩倍

為什麼在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指向它。

為什麼在JDK11上GraalVM的JavaScript性能是Nashorn的兩倍

這將確保您使用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。

寫在最後:

歡迎留言討論,如需Java方面的架構資料,我這裡剛好有一份,怎麼領取→→→關注+轉發 然後私信“架構資料” 即可領取

點關注,不迷路,持續更新!!!


分享到:


相關文章: