As a brief note today, I found that GraalVM was actually making one of my Scala/Java/JVM applications slower, so with the help of Thomas Wuerthinger at Oracle, I learned a little bit about how to use the GraalVM profile-guided optimizations.
The short story is:
- You need to install the GraalVM Enterprise Edition
- Then you need to install the Oracle GraalVM Enterprise Edition Native Image Early Adopter with this command:
gu install --local-file my/path/to/my/native_image_download.jar
You can find both of those downloads at this URL.
After downloading those, create a native image as usual, but add the
--pgo-instrument flag. Then run your application one time. Running your application creates a file named default.iprof. My command looked like this:
$ native-image --pgo-instrument -cp $SCALA_HOME/lib/scala-library.jar:FIND5.jar JavaNioFiles$delayedInit$body
That created a native image/executable named javaniofiles, and I ran it once.
Now create your native image a second time, this time with the
--pgo profile.iprof flag. This second image should run significantly faster than the first image. I actually had a problem with that flag, as it had this error:
$ native-image --pgo default.iprof -cp $SCALA_HOME/lib/scala-library.jar:FIND5.jar JavaNioFiles$delayedInit$body Build on Server(pid: 25373, port: 58567) [JavaNioFiles:25373] classlist: 3,364.67 ms Error: Main entry point class 'default.iprof' not found. Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception Error: Image build request failed with exit status 1
After reading the
native-image --help docs I saw that you can run
--pgo by itself, so I ran this command to create my second native executable:
$ native-image --pgo -cp $SCALA_HOME/lib/scala-library.jar:FIND5.jar JavaNioFiles$delayedInit$body
That created a new native image named javaniofiles (I renamed the first image before creating this one), and I ran it. The results were:
- First native image: Took 74 seconds to run
- Second native image: Took 56 seconds to run
Unfortunately in this specific case, running my JAR file with
java -jar is actually faster than GraalVM, but hopefully the Graal team will be able to fix that, as my other tests have shown Graal to usually be significantly faster than