Re: Does object pooling *ever* make sense?
Chris wrote:
I've read recently that object allocation in recent JVMs is so fast that
it doesn't make sense to create object pools. Just create a new object
when you need it and let the garbage collector do the work.
Does this hold true when your objects are very large, though? What if
your object contains a byte [] of length 100K? Or 1Mb?
What's the breakeven point beyond which it makes sense to reuse objects?
Thanks, everybody, for the insights, but nobody really shed any light on
the original question, which was: what's the breakeven point?
So I wrote a little code to test the question, pasted below. The code
simply allocates byte [] objects of varying sizes. Here are the results,
for 100,000 iterations, elapsed time in milliseconds:
bufsize 10 elapsed = 16
bufsize 1024 elapsed = 47
bufsize 10240 elapsed = 313
bufsize 102400 elapsed = 3078
bufsize 1048576 elapsed = 316540
bufsize 10Mb, terminated because it took too long
JDK 1.6, JVM memory = the default 64mb (increasing JVM memory did not
alter the results).
Contrary to some of the earlier advice in this thread, it is *not*
trivially fast to allocate larger objects. Allocation time increases
roughly linearly as object sizes increase.
Given that fetching an object from a pool 100,000 times should generally
not take more than a few milliseconds (locking & sync included), it
looks like object pooling is a necessity when speed is important and
objects get larger than a few dozen Kb in size.
public static void main(String[] argv) throws Exception {
// 10, 1K, 10K, 100K, 1Mb, 10Mb
int [] BUFSIZES = {10, 1024, 10 * 1024, 100 * 1024, 1024 * 1024, 10
*1024 * 1024};
int ITERATIONS = 100000;
for (int bufSizePtr = 0; bufSizePtr < BUFSIZES.length; bufSizePtr++) {
int bufSize = BUFSIZES[bufSizePtr];
long start = System.currentTimeMillis();
for (int i = 0; i < ITERATIONS; i++) {
byte[] buf = new byte [bufSize];
buf[0] = 1;
}
long elapsed = System.currentTimeMillis() - start;
System.out.println("bufsize " + bufSize + " elapsed = " + elapsed);
}
}