Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save andrwj/b0512d5ba3c8929c0855ec04fee2b10d to your computer and use it in GitHub Desktop.
Save andrwj/b0512d5ba3c8929c0855ec04fee2b10d to your computer and use it in GitHub Desktop.
How To Speed Up Clojure Hello World 100x Using GraalVM

How To Speed Up Clojure Hello World 100x Using GraalVM

Performance

Version Command Time (seconds)
Java time java -jar target/fastclj-1.0-standalone.jar 1.354
GraalVM time ./fastclj-1.0-standalone 0.014

Details

# Create project.
lein new fastclj; cd fastclj

# Create project.clj.
cat<<'END'>./project.clj
(defproject fastclj "1.0"
  :description "Fast hello world using GraalVM"
  :dependencies [[org.clojure/clojure "1.9.0"]]
  :main fastclj.core
  :aot  :all)
END

# Create core.clj.
cat<<'END'>./src/fastclj/core.clj
(ns fastclj.core (:gen-class))
(defn -main [& args] (println "Hello world!"))
END

# Compile jar.
lein compile && lein uberjar

# Test jar perf.
time java -jar target/fastclj-1.0-standalone.jar

# Download GraalVM and untar.
wget https://github.com/oracle/graal/releases/download/vm-1.0.0-rc12/graalvm-ce-1.0.0-rc12-macos-amd64.tar.gz
tar zxvf graalvm-ce-1.0.0-rc12-macos-amd64.tar.gz

# Path to GraalVM binaries.
GRAAL_BIN="$PWD/graalvm-ce-1.0.0-rc12/Contents/Home/bin"

# Create native image from jar. 
$GRAAL_BIN/native-image \
  -H:+ReportUnsupportedElementsAtRuntime \
  -J-Xmx3G -J-Xms3G --no-server \
  -jar target/fastclj-1.0-standalone.jar

# Inspect relative sizes.
ls -l ./fastclj-1.0-standalone target/*.jar

# Test perf of GraalVM-produced executable.
time ./fastclj-1.0-standalone 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment