/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.pool.performance;
import org.apache.commons.pool.impl.GenericObjectPool;
/**
* Multi-thread performance test
*
* @author Dirk Verbeeck
* @version $Revision: 1221705 $ $Date: 2011-12-21 08:03:54 -0500 (Wed, 21 Dec 2011) $
*/
public class PerformanceTest {
private int logLevel = 0;
private int nrIterations = 5;
private GenericObjectPool<Integer> pool;
private boolean start = false;
private volatile int waiting = 0;
private volatile int complete = 0;
private volatile long totalBorrowTime = 0;
private volatile long totalReturnTime = 0;
private volatile int nrSamples = 0;
public void setLogLevel(int i) {
logLevel = i;
}
private void init() {
start = false;
waiting = 0;
complete = 0;
totalBorrowTime = 0;
totalReturnTime = 0;
nrSamples = 0;
}
class MyThread implements Runnable {
long borrowTime;
long returnTime;
public void runOnce() {
try {
waiting++;
if (logLevel >= 5) {
String name = "thread" + Thread.currentThread().getName();
System.out.println(name + " waiting: " + waiting + " complete: " + complete);
}
long bbegin = System.currentTimeMillis();
Integer o = pool.borrowObject();
long bend = System.currentTimeMillis();
waiting--;
do {
Thread.yield();
}
while (!start);
if (logLevel >= 3) {
String name = "thread" + Thread.currentThread().getName();
System.out.println(name + " waiting: " + waiting + " complete: " + complete);
}
long rbegin = System.currentTimeMillis();
pool.returnObject(o);
long rend = System.currentTimeMillis();
Thread.yield();
complete++;
borrowTime = (bend-bbegin);
returnTime = (rend-rbegin);
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
runOnce(); // warmup
for (int i = 0; i<nrIterations; i++) {
runOnce();
totalBorrowTime += borrowTime;
totalReturnTime += returnTime;
nrSamples++;
if (logLevel >= 2) {
String name = "thread" + Thread.currentThread().getName();
System.out.println(
"result " + nrSamples + "\t" + name
+ "\t" + "borrow time: " + borrowTime + "\t" + "return time: " + returnTime
+ "\t" + "waiting: " + waiting + "\t" + "complete: " + complete);
}
}
}
}
private void run(int nrIterations, int nrThreads, int maxActive, int maxIdle) {
this.nrIterations = nrIterations;
init();
SleepingObjectFactory factory = new SleepingObjectFactory();
if (logLevel >= 4) { factory.setDebug(true); }
pool = new GenericObjectPool<Integer>(factory);
pool.setMaxActive(maxActive);
pool.setMaxIdle(maxIdle);
pool.setTestOnBorrow(true);
Thread[] threads = new Thread[nrThreads];
for (int i = 0; i < threads.length; i++) {
threads[i]= new Thread(new MyThread(), Integer.toString(i));
Thread.yield();
}
if (logLevel >= 1) { System.out.println("created"); }
Thread.yield();
for (int i = 0; i < threads.length; i++) {
threads[i].start();
Thread.yield();
}
if (logLevel >= 1) { System.out.println("started"); }
Thread.yield();
start = true;
if (logLevel >= 1) { System.out.println("go"); }
Thread.yield();
for (int i = 0; i < threads.length; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (logLevel >= 1) { System.out.println("finish"); }
System.out.println("-----------------------------------------");
System.out.println("nrIterations: " + nrIterations);
System.out.println("nrThreads: " + nrThreads);
System.out.println("maxActive: " + maxActive);
System.out.println("maxIdle: " + maxIdle);
System.out.println("nrSamples: " + nrSamples);
System.out.println("totalBorrowTime: " + totalBorrowTime);
System.out.println("totalReturnTime: " + totalReturnTime);
System.out.println("avg BorrowTime: " + totalBorrowTime/nrSamples);
System.out.println("avg ReturnTime: " + totalReturnTime/nrSamples);
}
public static void main(String[] args) {
PerformanceTest test = new PerformanceTest();
test.setLogLevel(0);
System.out.println("Increase threads");
test.run(1, 50, 5, 5);
test.run(1, 100, 5, 5);
test.run(1, 200, 5, 5);
test.run(1, 400, 5, 5);
System.out.println("Increase threads & poolsize");
test.run(1, 50, 5, 5);
test.run(1, 100, 10, 10);
test.run(1, 200, 20, 20);
test.run(1, 400, 40, 40);
System.out.println("Increase maxIdle");
test.run(1, 400, 40, 5);
test.run(1, 400, 40, 40);
// System.out.println("Show creation/destruction of objects");
// test.setLogLevel(4);
// test.run(1, 400, 40, 5);
}
}