import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import java.text.DecimalFormat;
import java.util.concurrent.CountDownLatch;
/**
* @author Daniel
*/
public class BenchmarkCommons {
static double[] statsAvgRespTime;
static double[] statsAvgBorrow;
static double[] statsAvgReturn;
public BenchmarkCommons(int workerCount, int loop) throws Exception {
CountDownLatch latch = new CountDownLatch(workerCount);
statsAvgRespTime = new double[workerCount];
statsAvgBorrow = new double[workerCount];
statsAvgReturn = new double[workerCount];
GenericObjectPool pool = new GenericObjectPool(new PooledObjectFactory() {
@Override
public PooledObject makeObject() throws Exception {
return new DefaultPooledObject(new StringBuilder());
}
@Override
public void destroyObject(PooledObject pooledObject) throws Exception {
}
@Override
public boolean validateObject(PooledObject pooledObject) {
return false;
}
@Override
public void activateObject(PooledObject pooledObject) throws Exception {
}
@Override
public void passivateObject(PooledObject pooledObject) throws Exception {
}
});
pool.setMinIdle(25);
pool.setMaxIdle(50);
pool.setMaxTotal(50);
pool.setMinEvictableIdleTimeMillis(60 * 1000 * 5L);
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.00").format(stats / workerCount));
stats = 0;
for (int i = 0; i < workerCount; i++) {
stats += statsAvgBorrow[i];
}
System.out.println("Average Borrow Time:" + new DecimalFormat("0.00").format(stats / workerCount));
stats = 0;
for (int i = 0; i < workerCount; i++) {
stats += statsAvgReturn[i];
}
System.out.println("Average Return Time:" + new DecimalFormat("0.00").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 GenericObjectPool pool;
private final CountDownLatch latch;
private final int loop;
public Worker(int id, GenericObjectPool 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();
long tb = 0, tr = 0;
for (int i = 0; i < loop; i++) {
StringBuilder obj = null;
try {
long tp1 = System.currentTimeMillis();
obj = (StringBuilder) pool.borrowObject();
tb += System.currentTimeMillis() - tp1;
obj.append("x");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (obj != null) {
try {
long tp3 = System.currentTimeMillis();
pool.returnObject(obj);
tr += System.currentTimeMillis() - tp3;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
long t2 = System.currentTimeMillis();
latch.countDown();
synchronized (statsAvgRespTime) {
statsAvgRespTime[id] = ((double) (t2 - t1)) / loop;
statsAvgBorrow[id] = ((double) tb) / loop;
statsAvgReturn[id] = ((double) tr) / loop;
}
}
}
}