Changes to prevent over aggressive optimization by the JIT which was producing

incorrect benchmarking results.
pull/35/head
Brett Wooldridge 11 years ago
parent c0232d2b33
commit 8378ab9d1e

@ -32,6 +32,7 @@ public class Benchmark1
{ {
private static int THREADS = Integer.getInteger("threads", 100); private static int THREADS = Integer.getInteger("threads", 100);
private static int POOL_MAX = Integer.getInteger("poolMax", 100); private static int POOL_MAX = Integer.getInteger("poolMax", 100);
private static String DATABASE;
private DataSource ds; private DataSource ds;
@ -46,43 +47,44 @@ public class Benchmark1
THREADS = Integer.parseInt(args[1]); THREADS = Integer.parseInt(args[1]);
POOL_MAX = Integer.parseInt(args[2]); POOL_MAX = Integer.parseInt(args[2]);
DATABASE= args[0];
Benchmark1 benchmarks = new Benchmark1(); Benchmark1 benchmarks = new Benchmark1();
if (args[0].equals("hikari")) if (DATABASE.equals("hikari"))
{ {
benchmarks.ds = benchmarks.setupHikari(); benchmarks.ds = benchmarks.setupHikari();
System.out.printf("Benchmarking HikariCP - %d threads, %d connections", THREADS, POOL_MAX); System.out.printf("Benchmarking HikariCP - %d threads, %d connections", THREADS, POOL_MAX);
} }
else if (args[0].equals("bone")) else if (DATABASE.equals("bone"))
{ {
benchmarks.ds = benchmarks.setupBone(); benchmarks.ds = benchmarks.setupBone();
System.out.printf("Benchmarking BoneCP - %d threads, %d connections", THREADS, POOL_MAX); System.out.printf("Benchmarking BoneCP - %d threads, %d connections", THREADS, POOL_MAX);
} }
else if (args[0].equals("dbpool")) else if (DATABASE.equals("dbpool"))
{ {
benchmarks.ds = benchmarks.setupDbPool(); benchmarks.ds = benchmarks.setupDbPool();
System.out.printf("Benchmarking DbPool - %d threads, %d connections", THREADS, POOL_MAX); System.out.printf("Benchmarking DbPool - %d threads, %d connections", THREADS, POOL_MAX);
} }
else if (args[0].equals("c3p0")) else if (DATABASE.equals("c3p0"))
{ {
benchmarks.ds = benchmarks.setupC3P0(); benchmarks.ds = benchmarks.setupC3P0();
System.out.printf("Benchmarking C3P0 - %d threads, %d connections", THREADS, POOL_MAX); System.out.printf("Benchmarking C3P0 - %d threads, %d connections", THREADS, POOL_MAX);
} }
else if (args[0].equals("tomcat")) else if (DATABASE.equals("tomcat"))
{ {
benchmarks.ds = benchmarks.setupTomcat(); benchmarks.ds = benchmarks.setupTomcat();
System.out.printf("Benchmarking Tomcat-JDBC - %d threads, %d connections", THREADS, POOL_MAX); System.out.printf("Benchmarking Tomcat-JDBC - %d threads, %d connections", THREADS, POOL_MAX);
} }
else else
{ {
System.err.println("Start with one of: hikari, bone"); System.err.println("Start with one of: hikari, bone, dbpool, c3p0, tomcat");
System.exit(0); System.exit(0);
} }
System.out.println("\nMixedBench"); System.out.println("\nMixedBench");
System.out.println(" Warming up JIT"); System.out.println(" Warming up JIT");
benchmarks.startMixedBench(100, 10000); benchmarks.startMixedBench(10, 6000);
benchmarks.startMixedBench(100, 10000); benchmarks.startMixedBench(10, 6000);
System.out.println(" MixedBench Final Timing Runs"); System.out.println(" MixedBench Final Timing Runs");
benchmarks.startMixedBench(THREADS, 1000); benchmarks.startMixedBench(THREADS, 1000);
benchmarks.startMixedBench(THREADS, 1000); benchmarks.startMixedBench(THREADS, 1000);
@ -147,6 +149,7 @@ public class Benchmark1
int i = 0; int i = 0;
long[] track = new long[runners.length]; long[] track = new long[runners.length];
long max = 0, avg = 0, med = 0; long max = 0, avg = 0, med = 0;
long counter = 0;
long absoluteStart = Long.MAX_VALUE, absoluteFinish = Long.MIN_VALUE; long absoluteStart = Long.MAX_VALUE, absoluteFinish = Long.MIN_VALUE;
for (Measurable runner : runners) for (Measurable runner : runners)
{ {
@ -156,11 +159,12 @@ public class Benchmark1
track[i++] = elapsed; track[i++] = elapsed;
max = Math.max(max, elapsed); max = Math.max(max, elapsed);
avg = (avg + elapsed) / 2; avg = (avg + elapsed) / 2;
counter += runner.getCounter();
} }
Arrays.sort(track); Arrays.sort(track);
med = track[runners.length / 2]; med = track[runners.length / 2];
System.out.printf(" max=%d%4$s, avg=%d%4$s, med=%d%4$s\n", max, avg, med, timeUnit); System.out.printf(" %s max=%d%5$s, avg=%d%5$s, med=%d%5$s\n", (Boolean.getBoolean("showCounter") ? "Counter=" + counter : ""), max, avg, med, timeUnit);
return absoluteFinish - absoluteStart; return absoluteFinish - absoluteStart;
} }
@ -231,6 +235,7 @@ public class Benchmark1
ComboPooledDataSource cpds = new ComboPooledDataSource(); ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.zaxxer.hikari.performance.StubDriver" ); cpds.setDriverClass( "com.zaxxer.hikari.performance.StubDriver" );
cpds.setJdbcUrl( "jdbc:stub" ); cpds.setJdbcUrl( "jdbc:stub" );
cpds.setInitialPoolSize(POOL_MAX / 2);
cpds.setMinPoolSize(POOL_MAX / 2); cpds.setMinPoolSize(POOL_MAX / 2);
cpds.setMaxPoolSize(POOL_MAX); cpds.setMaxPoolSize(POOL_MAX);
cpds.setCheckoutTimeout(8000); cpds.setCheckoutTimeout(8000);
@ -254,13 +259,14 @@ public class Benchmark1
p.setUsername("sa"); p.setUsername("sa");
p.setPassword(""); p.setPassword("");
p.setInitialSize(POOL_MAX / 2); p.setInitialSize(POOL_MAX / 2);
p.setMinIdle(0); p.setMinIdle(POOL_MAX / 2);
p.setMaxIdle(POOL_MAX); p.setMaxIdle(POOL_MAX);
p.setMaxActive(POOL_MAX); p.setMaxActive(POOL_MAX);
p.setMaxWait(8000); p.setMaxWait(8000);
p.setMinEvictableIdleTimeMillis((int) TimeUnit.MINUTES.toMillis(30)); p.setMinEvictableIdleTimeMillis((int) TimeUnit.MINUTES.toMillis(30));
p.setTestOnBorrow(true); p.setTestOnBorrow(true);
p.setValidationQuery("VALUES 1"); p.setValidationQuery("VALUES 1");
p.setJdbcInterceptors("StatementFinalizer");
DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(p); DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(p);
@ -271,9 +277,9 @@ public class Benchmark1
{ {
private CyclicBarrier barrier; private CyclicBarrier barrier;
private CountDownLatch latch; private CountDownLatch latch;
private long start; private volatile long start;
private long finish; private volatile long finish;
private int counter; private volatile int counter;
private final int iter; private final int iter;
public MixedRunner(CyclicBarrier barrier, CountDownLatch latch, int iter) public MixedRunner(CyclicBarrier barrier, CountDownLatch latch, int iter)
@ -289,12 +295,13 @@ public class Benchmark1
{ {
barrier.await(); barrier.await();
int localCounter = 0;
start = System.nanoTime(); start = System.nanoTime();
for (int i = 0; i < iter; i++) for (int i = 0; i < iter; i++)
{ {
Connection connection = ds.getConnection();
for (int j = 0; j < 100; j++) for (int j = 0; j < 100; j++)
{ {
Connection connection = ds.getConnection();
PreparedStatement statement = connection.prepareStatement("INSERT INTO test (column) VALUES (?)"); PreparedStatement statement = connection.prepareStatement("INSERT INTO test (column) VALUES (?)");
for (int k = 0; k < 100; k++) for (int k = 0; k < 100; k++)
{ {
@ -304,20 +311,22 @@ public class Benchmark1
statement.addBatch(); statement.addBatch();
} }
statement.executeBatch(); statement.executeBatch();
statement.close();
localCounter += statement.unwrap(StubPreparedStatement.class).getCount();
statement = connection.prepareStatement("SELECT * FROM test WHERE foo=?"); statement = connection.prepareStatement("SELECT * FROM test WHERE foo=?");
ResultSet resultSet = statement.executeQuery(); ResultSet resultSet = statement.executeQuery();
for (int k = 0; k < 100; k++) for (int k = 0; k < 100; k++)
{ {
resultSet.next(); resultSet.next();
counter += resultSet.getInt(1); // ensures the JIT doesn't optimize this loop away localCounter += resultSet.getInt(1); // ensures the JIT doesn't optimize this loop away
} }
resultSet.close();
statement.close(); connection.close();
} }
connection.close();
} }
counter = localCounter;
} }
catch (Exception e) catch (Exception e)
{ {

Loading…
Cancel
Save