Performance Tip: Don't use StringBuilder for compile time constants.

Overview

Using String + String notation is simpler than using a StringBuilder. It can be slower but for compiler time constants is faster to use.

When using String + String is faster

One of the few optimisations the compiler will do is inline compile time constants.
String + expressions which can be evaluated at compile time and don't need to be computed at runtime.

From ContextFinder.find()
final String jaxbContextFQCN = JAXBContext.class.getName();
final StringBuilder resource = new StringBuilder().append("META-INF/services/").append(jaxbContextFQCN);
However, the compiler can compute the resource variable to a String literal at compile time improving performance.
final String jaxbContextFQCN = JAXBContext.class.getName();
// becomes a String literal.
final StringBuilder resource = "META-INF/services/" + jaxbContextFQCN;
Not only is this simpler, but also faster.

Comments

  1. I didn't understand the compiler optimization you try to explain in the above post. In a sample when I try

    String className = StringVsStringBuilderApp.class.getName();
    String s = className + " Some Compile Time Constant";

    I can still see the class file having the same two statements. So it looks like the string variable s is not evaluated by the compiler. Can you detail a bit on the optimization?

    ReplyDelete

Post a Comment

Popular posts from this blog

Why You Should Tune Code Before Your Garbage Collector

Asking multiple AI to optimise the same code

Which Doc Format is Best for AI Specifications?