import com.haiwanwan.common.objectpool.ObjectFactory; import com.haiwanwan.common.objectpool.ObjectPool; import com.haiwanwan.common.objectpool.PoolConfig; import com.haiwanwan.common.objectpool.Poolable; import java.text.DecimalFormat; import java.util.concurrent.CountDownLatch; /** * @author Daniel */ public class BenchmarkFastObjectPool { private static double[] statsAvgRespTime; public BenchmarkFastObjectPool(int workerCount, int loop) throws InterruptedException { statsAvgRespTime = new double[workerCount]; CountDownLatch latch = new CountDownLatch(workerCount); PoolConfig config = new PoolConfig(); config.setPartitionSize(5); config.setMaxSize(10); config.setMinSize(5); config.setMaxIdleMilliseconds(60 * 1000 * 5); ObjectFactory<StringBuilder> factory = new ObjectFactory<StringBuilder>() { @Override public StringBuilder create() { return new StringBuilder(); } @Override public void destroy(StringBuilder o) { } @Override public boolean validate(StringBuilder o) { return true; } }; ObjectPool pool = new ObjectPool(config, factory); Worker[] workers = new Worker[workerCount]; for (int i = 0; i < workerCount; i++) { workers[i] = new Worker(i, pool, latch, loop); } long t1 = System.currentTimeMillis(); for (int i = 0; i < workerCount; i++) { workers[i].start(); } latch.await(); long t2 = System.currentTimeMillis(); double stats = 0; for (int i = 0; i < workerCount; i++) { stats += statsAvgRespTime[i]; } System.out.println("Average Response Time:" + new DecimalFormat("0").format(stats / workerCount)); System.out.println("Average Througput Per Second:" + new DecimalFormat("0").format(( (double) loop * workerCount * 1000 ) / (t2 - t1) )); } private static class Worker extends Thread { private final int id; private final ObjectPool<StringBuilder> pool; private final CountDownLatch latch; private final int loop; public Worker(int id, ObjectPool<StringBuilder> pool, CountDownLatch latch, int loop) { this.id = id; this.pool = pool; this.latch = latch; this.loop = loop; } @Override public void run() { long t1 = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { Poolable<StringBuilder> obj = null; try { obj = pool.borrowObject(); obj.getObject().append("x"); } finally { if (obj != null) { pool.returnObject(obj); } } } long t2 = System.currentTimeMillis(); synchronized (statsAvgRespTime) { statsAvgRespTime[id] = ((double) (t2 - t1)) / loop; } latch.countDown(); } } }