views:

137

answers:

3

What is the memory and performance usage compared to creating a object with only a constructor?

The usage here is in creating a Set<Object> or List<Object> that may contain million plus entries and I am concerned with the overhead of using Bloch's Builder Pattern. I have used it in the past, but never in this large of a scope.

Reference: Item 2: Consider a builder when faced with many constructor parameters, reprinted in Creating and Destroying Java Objects: Part 1, excerpted from Effective Java Second Edition by Joshua Bloch.

+5  A: 

You have the additional Builder-object, that is discarded after the creation of the object. So you may have some impact on memory-usage and speed. But the Java-VM does optimize very strongly, especially the Server-VM (java -server), so the VM may optimize away the builder completely. So my suggestion is you should measure the real impact (as always if you care about performance) and decide if the impact is too big.

Mnementh
+1, It is a non-trivial test to build, but I will do. I have no control over what JVM is used though, so i was looking for generalities.
WolfmanDragon
A: 

It's hard to tell from your initial description but if you are concerned about passing a Collection<Object> with a ~million entries to a constructor vs to a Builder, then the cost of one additional (short-lived) object is barely worth discussing.

matt b
I think he creates the millions of objects with the builder-pattern. That means for every of the million objects and additional temporary builder-object.
Mnementh
He could probably just add a .clear() method or something to the builder each iteration to empty it's contents.
A: 

The cost is negligible since the builder reference can be garbage collected immediately after building the object.

The impact of creating 1m of extra objects should be below 10s in any circumstance.

OscarRyz
Actually I'd expect less than 1s, even on an average netbook or upper-class smart phone.
sfussenegger
@sfusseneger: Yeap, I created 1m objects in a simple for loop and it took me about 400 ms ... I think 10 s should cover all the cases but I agree with you.
OscarRyz