Profiling¶
In this section you can find some tips on how to profile your Scala Native binary in Linux.
Measuring execution time and memory¶
- With the
time
command you can measure execution time:
$ time ./target/scala-2.13/scala-native-out
real 0m0,718s
user 0m0,419s
sys 0m0,299s
- With the
/usr/bin/time --verbose
command you can also see memory consumption:
Creating Flamegraphs¶
A flamegraph is a visualization of the most frequent code-paths of a program. You can use flamegraphs to see where your program spends most of its CPU time. Follow these steps:
- You need to install the
perf
command if you haven’t got it already:
$ sudo apt update && sudo apt install linux-tools-generic
- Then clone the flamegraph repository into e.g.
~/git/hub/
$ cd ~ && mkdir -p git/hub && cd git/hub/
$ git clone git@github.com:brendangregg/FlameGraph.git
- Then navigate to your Scala Native project and, after building your binary, you can create a flamegraph like so:
$ sudo perf record -F 1000 -a -g ./target/scala-2.13/scala-native-out
$ sudo perf script > out.perf
$ ~/git/hub/FlameGraph/stackcollapse-perf.pl out.perf > out.folded
$ ~/git/hub/FlameGraph/flamegraph.pl out.folded > kernel.svg
- Open the file
kernel.svg
in your browser and you can zoom in the interactive SVG-file by clicking on the colored boxes as explained here. A box represents a stack frame. The broader a box is the more CPU cycles have been spent. The higher the box is, the deeper in the call-chain it is. - The perf option
-F 1000
means that the sampling frequency is set to 1000 Hz. You can experiment with changing this option to get the right accuracy; start with e.g.-F 99
and see what you get. You can then increase the sampling frequency to see if more details adds interesting information.