1 5 package org.h2.test.bench; 6 7 import java.io.FileWriter ; 8 import java.io.PrintWriter ; 9 import java.sql.Connection ; 10 import java.sql.DriverManager ; 11 import java.sql.PreparedStatement ; 12 import java.sql.ResultSet ; 13 import java.sql.Statement ; 14 import java.util.ArrayList ; 15 import java.util.Properties ; 16 17 import org.h2.test.TestBase; 18 import org.h2.util.IOUtils; 19 import org.h2.util.JdbcUtils; 20 21 public class TestPerformance { 22 23 boolean collect; 24 25 public static void main(String [] args) throws Exception { 26 new TestPerformance().test(args); 27 } 28 29 private Connection getResultConnection() throws Exception { 30 Class.forName("org.h2.Driver"); 31 return DriverManager.getConnection("jdbc:h2:data/results"); 32 } 33 34 private void openResults(boolean init) throws Exception { 35 Connection conn = null; 36 Statement stat = null; 37 try { 38 conn = getResultConnection(); 39 stat = conn.createStatement(); 40 if(init) { 41 stat.execute("DROP TABLE IF EXISTS RESULTS"); 42 } 43 stat.execute("CREATE TABLE IF NOT EXISTS RESULTS(TESTID INT, TEST VARCHAR, " 44 + "UNIT VARCHAR, DBID INT, DB VARCHAR, RESULT VARCHAR)"); 45 } finally { 46 JdbcUtils.closeSilently(stat); 47 JdbcUtils.closeSilently(conn); 48 } 49 } 50 51 private void test(String [] args) throws Exception { 52 boolean init = false; 53 int dbId = -1; 54 String out = "benchmark.html"; 55 for(int i=0; i<args.length; i++) { 56 if(args[i].equals("-db")) { 57 dbId = Integer.parseInt(args[++i]); 58 } else if(args[i].equals("-init")) { 59 init = true; 60 } else if(args[i].equals("-out")) { 61 out = args[++i]; 62 } 63 } 64 openResults(init); 65 66 Properties prop = new Properties (); 67 prop.load(getClass().getResourceAsStream("test.properties")); 68 int size = Integer.parseInt(prop.getProperty("size")); 69 ArrayList dbs = new ArrayList (); 70 for(int i=0; i<100; i++) { 71 if(dbId != -1 && i != dbId) { 72 continue; 73 } 74 String dbString = prop.getProperty("db" + i); 75 if(dbString != null) { 76 Database db = Database.parse(this, i, dbString); 77 if(db != null) { 78 db.setTranslations(prop); 79 dbs.add(db); 80 } 81 } 82 } 83 ArrayList tests = new ArrayList (); 84 for(int i=0; i<100; i++) { 85 String testString = prop.getProperty("test" + i); 86 if(testString != null) { 87 Bench bench = (Bench)Class.forName(testString).newInstance(); 88 tests.add(bench); 89 } 90 } 91 testAll(dbs, tests, size); 92 collect = false; 93 if(dbs.size() == 0) { 94 return; 95 } 96 ArrayList results = ((Database)dbs.get(0)).getResults(); 97 Connection conn = null; 98 PreparedStatement prep = null; 99 Statement stat = null; 100 PrintWriter writer = null; 101 try { 102 conn = getResultConnection(); 103 stat = conn.createStatement(); 104 prep = conn.prepareStatement( 105 "INSERT INTO RESULTS(TESTID, TEST, UNIT, DBID, DB, RESULT) VALUES(?, ?, ?, ?, ?, ?)"); 106 for(int i=0; i<results.size(); i++) { 107 Object [] res = (Object [])results.get(i); 108 prep.setInt(1, i); 109 prep.setString(2, res[0].toString()); 110 prep.setString(3, res[1].toString()); 111 for(int j=0; j<dbs.size(); j++) { 112 Database db = (Database)dbs.get(j); 113 prep.setInt(4, db.getId()); 114 prep.setString(5, db.getName()); 115 ArrayList r = db.getResults(); 116 Object [] v = (Object [])r.get(i); 117 prep.setString(6, v[2].toString()); 118 prep.execute(); 119 } 120 } 121 122 writer = new PrintWriter (new FileWriter (out)); 123 ResultSet rs = stat.executeQuery( 124 "CALL '<table><tr><th>Test Case</th><th>Unit</th>' " 125 +"|| SELECT GROUP_CONCAT('<th>' || DB || '</th>' ORDER BY DBID SEPARATOR '') FROM " 126 +"(SELECT DISTINCT DBID, DB FROM RESULTS)" 127 +"|| '</tr>' || CHAR(10) " 128 +"|| SELECT GROUP_CONCAT('<tr><td>' || TEST || '</td><td>' || UNIT || '</td>' || ( " 129 +"SELECT GROUP_CONCAT('<td>' || RESULT || '</td>' ORDER BY DBID SEPARATOR '') FROM RESULTS R2 WHERE " 130 +"R2.TESTID = R1.TESTID) || '</tr>' ORDER BY TESTID SEPARATOR CHAR(10)) FROM " 131 +"(SELECT DISTINCT TESTID, TEST, UNIT FROM RESULTS) R1" 132 +"|| '</table>'" 133 ); 134 rs.next(); 135 String result = rs.getString(1); 136 writer.println(result); 137 } finally { 138 JdbcUtils.closeSilently(prep); 139 JdbcUtils.closeSilently(stat); 140 JdbcUtils.closeSilently(conn); 141 IOUtils.closeSilently(writer); 142 } 143 144 157 178 System.out.println("Test finished"); 179 System.exit(0); 180 } 181 182 private void testAll(ArrayList dbs, ArrayList tests, int size) throws Exception { 183 for(int i=0; i<dbs.size(); i++) { 184 if(i>0) { 185 Thread.sleep(1000); 186 } 187 TestBase.getMemoryUsed(); 189 Database db = (Database)dbs.get(i); 190 System.out.println("testing " + db.getName()); 191 db.startServer(); 192 Connection conn = db.getConnection(); 193 runDatabase(db, tests, 1); 194 runDatabase(db, tests, 1); 195 collect = true; 196 runDatabase(db, tests, size); 197 conn.close(); 198 db.log("Executed Statements", "#", db.getExecutedStatements()); 199 db.log("Total Time", "ms", db.getTotalTime()); 200 db.log("Statement per Second", "#", db.getExecutedStatements()*1000/db.getTotalTime()); 201 collect = false; 202 db.stopServer(); 203 } 204 } 205 206 private void runDatabase(Database db, ArrayList tests, int size) throws Exception { 207 for(int j=0; j<tests.size(); j++) { 208 Bench bench = (Bench)tests.get(j); 209 runTest(db, bench, size); 210 } 211 } 212 213 private void runTest(Database db, Bench bench, int size) throws Exception { 214 bench.init(db, size); 215 bench.run(); 216 } 217 218 } 219 | Popular Tags |