graalvmGraalVM流行ってますね。多くの人はGraalをAOTとして使うnative-imageのことだけをGraalVMと言ってたりします。このエントリではGraalをJITとして使うHotSpotモードとGraalをAOTとして使うnative-imageの両方が遅いという話です。GraalVMは速い、と言われてますが、残念ながらHotSpotモードでC2より速い結果を手元では出せていません。公式ブログでは1.7倍から5倍速くなると書いてますけど、手元では再現できてません。Mediumnative-imageは速い、というのはよくありますが、これはネイティブ化によりJVMの起動時間や最適化の時間、最適化されずに動く時間が省略されるので起動が速い、という話です。長く動くプロセスの場合、そういった起動にかかる時間というのは無視できるようになり、実行時に集めた情報を使って最適化するJITのほうが速いです。用語についてところでここで用語の確認を。GraalVMというのは、Javaで書かれたJITコンパイラGraalを中心とした多言語環境です。普通にGraalをJavaのJITコンパイラとして使うのがGraalVMのHotSpotモードです。ようするにjavaコマンドです。Graalの最適化機構を一般のスクリプト言語から使えるようにしてJavaScriptやRubyのJITコンパイラにしてしまうのがTruffleです。Graalを事前にJavaコードに適用してネイティブ化するというのがnative-imageです。計測ということで、どのくらい遅いか比べてみます。コードはこのレイトレ。https://github.com/kishida/smallpt4j/blob/original/src/main/java/naoki/smallpt/SmallPT.javacommonsのFastMathを使っているので、通常のjava.lang.Mathに置き換えて実行します。ループ中のSystem.out.printlnはコメントアウトしました。それはそうと、以前はこのコードはImageIOを使っているのでGraalVMでネイティブ化できなかったのですが、いまではできるようになってます。実行するとこんな感じのPNG画像が出力されます。CEここではWindowsで動かしてみました。GraalVMは19.0.2CEです。HotSpotモード。Time:PT9.713S10秒弱。ネイティブ化してみます。Time:PT45.234S45秒。EEついでにEEでも試してみます。Time:PT10.281S10秒強。