Which of the following is better in terms of performance and efficient memory usage?
Boolean isItTrue(arg){
return Boolean.TRUE;
}
boolean isItTrue(arg){
return Boolean.TRUE
}
Boolean isItTrue(arg){
return true;
}
boolean isItTrue(arg){
return true;
}
It should be faster and easier to work with primitive types, but on the other hand, when using a reference to a static object, no new value is created. Or is it optimized on compiler level and all true
and false
are replaced by references to the static objects to save memory?
My rules of thumb are as follows:
boolean
).Boolean
).With this in mind, my default choice would be:
As far as performance is concerned, the only thing that seems certain is that it's hard to imagine a scenario where using
Boolean
would be faster than usingboolean
. Whether it would be slower or the same depends on a lot of things and it's impossible to answer in general.If you really care about this, profile the code where it matters!
Firstly, the performance advantage of using any one over the others is most likely to be too small to be relevant. Code simplicity / readability / maintainability is a far more important ... in the vast majority of cases.
None of the examples involve creating an
Boolean
instances. It is theoretically possible that 3 of the 4 will trigger initialization of theBoolean
class ... and that your application wouldn't otherwise have done that. In that highly unlikely event, your entire application will allocate 2 objects that wouldn't otherwise have been allocated.This one will be equal to or faster than all of the others because it simply entails setting a register to zero.
Taken in isolation, this has to load a static reference from memory, rather than zero a register. However, the JIT compiler may be able to optimize this away in some circumstances.
On the face of it, this involve a call to
Boolean.valueOf(true)
to "box" thetrue
, but the JIT compiler should be able to optimize it to the same code as the previous one by inlining the call.On the face of it, this involves a call to
Boolean.booleanValue(Boolean.TRUE)
to "unbox" theBoolean
. This call can be inlined. It is also possible that the JIT compiler can avoid loading the reference to theBoolean
object and fetching its value field.Bottom line is that it the relative performance of the 4 alternatives depends on how successful the JIT compiler will be in optimizing. That will depend on the context, the specific of the JIT compiler, the JVM settings, and so on. In the best case, the JIT compiler could (at least in theory) produce the same (optimal) code for all of them.
They will be much faster. I don't think there will be any difference between these two.
But other implementation will be slower because it will be boxing and unboxing on the back end with will take some time of processor.
Edit
I have collected some facts by implementing the 4 different ways. Just want to share it with you, I don't if its the write way to do that.
Main Class