I was just reading the Scala man page, looking for something else, when I ran across this tip on how to speed up the execution of Scala shell scripts, using the savecompiled flag of the
-savecompiled Save the compiled version of scripts in order to speed up later executions of the same script. When running a script, save the compiled version of in a file with the same name as the script but with an extension of .jar. On subsequent runs of the same script, the pre-compiled .jar file will be used if it is newer than the script file.
I just tested this with the simple example that they include at the bottom of the Scala man page:
#!/bin/sh exec scala -savecompiled "$0" "$@" !# Console.println("Hello, world!") argv.toList foreach Console.println
I saved that script to a file named
foo.sh, then ran the script like this:
$ sh foo.sh
After running the script, I looked in the current directory with the
ls command, and saw that a jar file had indeed been created for me:
drwxr-xr-x 5 Al Al 170 May 14 09:06 . drwxr-xr-x 3 Al Al 102 Apr 4 17:58 .. -rw-r--r-- 1 Al Al 118 May 14 09:06 foo.sh -rw-r--r-- 1 Al Al 2727 May 14 09:06 foo.sh.jar
You can tell that the Scala script runs significantly faster after the jar file has been created, and as a quick little test, I deleted the jar file, then ran the script again, and saw this run time:
# run time without the jar file $ time sh foo.sh a b Hello, world! a b real 0m1.573s user 0m0.574s sys 0m0.089s
After this run the jar file was automatically created again, so when I ran the script one more time, I got this output:
# run time with the jar file $ time sh foo.sh a b Hello, world! a b real 0m0.458s user 0m0.487s sys 0m0.075s
As you can see from the "real" time output, the run time after the shell script has been compiled to a jar file is much faster, less than half a second, compared to more than 1.5 seconds without the jar file.
As I keep trying to embed Scala in my brain, I've been writing all of my shell scripts with Scala, so this is a pretty cool tip; I hope you like it also.