JAX: Java performance myths #
This talk was one of the famous talks on Java performance myths by Arno Haase.
His main point - supported with
dozens of illustrative examples was for
software developers to stop trusting in word of mouth, cargo cult like
myths
that are abundant among engineers. Again the goal should be to write readable
code above all - for one the
Java compiler and JIT are great at optimising. In
addition many of the myths being spread in the Java community that
are claimed
to lead to better performance are simply not true.
It was interesting to learn how many
different aspects of both software and
hardware contribute to code performance. Micro benchmarks are
considered
dangerous for a reason - creating a well controlled environment that matches
what the code will
encounter in production is influenced by things like just in
time compilation, cpu throttling,
etc.
Some myths that Arno proved wrong include final making code faster (in case of
method parameters
it doesn’t make a difference up to bytecode being identical
with and without), inheritance being always expensive
(even with an abstract
class between the interface and the implementation Java 6 and 7 can still
inline the
method in question). Another one was on often wrongly scoped Java
vs. C comparisons. One myth resolved around the
creation of temporary objects -
since Java 6 and 7 in simple cases even these can be optimised
away.
When it comes to (un-)boxing and reflection there is a performance penalty. For
the latter
mostly for method lookup, not so much for calling the method. What we
are talking about however are penalties in the
range of about 1000 compute
cycles. Compared to doing any remote calls this is still dwarfed. Reflection
on
fields is even cheaper.
One of the more wide spread myths resolved around string concatenation
being
expensive - doing a A'' +
B’’ in code will be turned into ``AB’’ in
bytecode. Even doing the same with
a variable will be turned into the use of
StringBuilder ever since -XX:OptimizeStringConcat was turned on by
default.
The main message here is to stop trusting your intuition when reasoning about a
system’s
performance and performance bottlenecks. Instead the goal should be to
go and measure what is really going on. Those
are simple examples where your
average Java intuition goes wrong. Make sure to stay on top with what the
JVM
turns your code into and how that is than executed on the hardware you have
rolled out if you really want to
get the last bit of speed out of your
application.