test.BasePerfTest Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aalto-xml Show documentation
Show all versions of aalto-xml Show documentation
Ultra-high performance non-blocking XML processor (Stax/Stax2, SAX/SAX2)
package test;
import java.io.*;
public abstract class BasePerfTest
{
final static int DEFAULT_SECS = 15;
protected BasePerfTest() { }
protected final int test(String[] args)
throws Exception
{
if (args.length != 1) {
System.err.println("Usage: java ... "+getClass().getName()+" [file]");
System.exit(1);
}
try {
int total = test2(new File(args[0]), DEFAULT_SECS);
System.out.println();
System.out.println("Total: "+total);
return total;
} catch (Exception t) {
System.err.println("Error: "+t);
t.printStackTrace();
throw t;
}
}
protected final int test2(File file, int SECS)
throws Exception
{
/* Let's try to ensure GC is done so that real test can start from
* a clean state.
*/
try { Thread.sleep(100L); } catch (InterruptedException ie) { }
System.gc();
try { Thread.sleep(100L); } catch (InterruptedException ie) { }
System.gc();
try { Thread.sleep(100L); } catch (InterruptedException ie) { }
System.out.println("Ok, warmup done. Now doing real testing, running for "+SECS+" seconds.");
long nextTime = System.currentTimeMillis();
long endTime = nextTime + (SECS * 1000);
int count = 0;
int total = 0;
int subtotal = 0;
final long SUB_PERIOD = 1000L; // print once a second
nextTime += SUB_PERIOD;
/* Let's try to reduce overhead of System.currentTimeMillis()
* by calling test method twice each round. May be a problem for
* big docs/slow readers... but otherwise not.
*/
while (true) {
total += testExec(file);
total += testExec(file);
long now = System.currentTimeMillis();
if (now > endTime) {
break;
}
/* let's only print once a second... limits console overhead,
* but still informs about progress.
*/
subtotal += 2;
if (now > nextTime) {
count += subtotal;
/* Let's normalize to start from 0 (since 2 is minimum
* possible, in increments of 2)
*/
subtotal = (subtotal >> 1) - 1;
char c;
if (subtotal > 35) {
c = '+';
} else if (subtotal > 9) {
c = (char) ('a' + (subtotal-10));
} else {
c = (char) ('0' + subtotal);
}
System.out.print(c);
nextTime += SUB_PERIOD;
if (nextTime < now) {
nextTime = now;
}
subtotal = 0;
}
}
System.out.println("Total iterations done: "+count+" [done "+total+"]");
return total;
}
protected abstract int testExec(File file)
throws Exception;
}