Boolean valueOf instead of new Boolean

Aleksey Shipilev aleksey.shipilev at oracle.com
Sat May 24 15:19:41 UTC 2014


On 05/24/2014 06:34 PM, Otávio Gonçalves de Santana wrote:
> The Boolean class has cache for true and false and using it, will save
> memory and will faster than using create new instance of boolean.
> Using JMH[1] with a code test[2] the result was:

I agree Boolean.valueOf (whether explicit or implicit) should be used if
identity is not required. Do you really need explicit Boolean.valueOf
in, say, GSSManagerImpl, instead of relying on autoboxing?

That said, your benchmark is not correct. At very least, you have to use
explicit BlackHoles to avoid DCE [1][2]. This is how you do it:

@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.SECONDS)
public class BooleanBenchmark {

    @Param("1000000")
    private int size;

    private List<String> booleanString;
    private boolean[] booleans;

    @Setup
    public void s() {
        booleans = new boolean[size];
        booleanString = new ArrayList<String>(size);

        for (int index = 0; index < size; index++) {
            if (index % 2 == 0) {
                booleans[index] = true;
                booleanString.add(Boolean.TRUE.toString());
            } else {
                booleans[index] = false;
                booleanString.add(Boolean.FALSE.toString());
            }
        }
    }

    @GenerateMicroBenchmark
    public void valueOfBoolean(BlackHole bh) {
        for (boolean b : booleans) {
            Boolean result = b;
            bh.consume(result);
        }
    }

    @GenerateMicroBenchmark
    public void valueOfString(BlackHole bh) {
        for (String b : booleanString) {
            Boolean result = Boolean.valueOf(b);
            bh.consume(result);
        }
    }

    @GenerateMicroBenchmark
    public void newInstanceBoolean(BlackHole bh) {
        for (boolean b : booleans) {
            Boolean result = new Boolean(b);
            bh.consume(result);
        }
    }

    @GenerateMicroBenchmark
    public void newInstanceString(BlackHole bh) {
        for (String b : booleanString) {
            Boolean result = new Boolean(b);
            bh.consume(result);
        }
    }
}

Thanks,
-Aleksey.


[1]
http://hg.openjdk.java.net/code-tools/jmh/file/75f8b23444f6/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_08_DeadCode.java
[2]
http://hg.openjdk.java.net/code-tools/jmh/file/75f8b23444f6/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_09_Blackholes.java




More information about the core-libs-dev mailing list