KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > test > bench > TestPerformance


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.test.bench;
6
7 import java.io.FileWriter JavaDoc;
8 import java.io.PrintWriter JavaDoc;
9 import java.sql.Connection JavaDoc;
10 import java.sql.DriverManager JavaDoc;
11 import java.sql.PreparedStatement JavaDoc;
12 import java.sql.ResultSet JavaDoc;
13 import java.sql.Statement JavaDoc;
14 import java.util.ArrayList JavaDoc;
15 import java.util.Properties JavaDoc;
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 JavaDoc[] args) throws Exception JavaDoc {
26         new TestPerformance().test(args);
27     }
28     
29     private Connection JavaDoc getResultConnection() throws Exception JavaDoc {
30         Class.forName("org.h2.Driver");
31         return DriverManager.getConnection("jdbc:h2:data/results");
32     }
33     
34     private void openResults(boolean init) throws Exception JavaDoc {
35         Connection JavaDoc conn = null;
36         Statement JavaDoc 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 JavaDoc[] args) throws Exception JavaDoc {
52         boolean init = false;
53         int dbId = -1;
54         String JavaDoc 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 JavaDoc prop = new Properties JavaDoc();
67         prop.load(getClass().getResourceAsStream("test.properties"));
68         int size = Integer.parseInt(prop.getProperty("size"));
69         ArrayList JavaDoc dbs = new ArrayList JavaDoc();
70         for(int i=0; i<100; i++) {
71             if(dbId != -1 && i != dbId) {
72                 continue;
73             }
74             String JavaDoc 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 JavaDoc tests = new ArrayList JavaDoc();
84         for(int i=0; i<100; i++) {
85             String JavaDoc 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 JavaDoc results = ((Database)dbs.get(0)).getResults();
97         Connection JavaDoc conn = null;
98         PreparedStatement JavaDoc prep = null;
99         Statement JavaDoc stat = null;
100         PrintWriter JavaDoc 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 JavaDoc[] res = (Object JavaDoc[])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 JavaDoc r = db.getResults();
116                     Object JavaDoc[] v = (Object JavaDoc[])r.get(i);
117                     prep.setString(6, v[2].toString());
118                     prep.execute();
119                 }
120             }
121             
122             writer = new PrintWriter JavaDoc(new FileWriter JavaDoc(out));
123             ResultSet JavaDoc 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 JavaDoc 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 // ResultSet rsDbs = conn.createStatement().executeQuery("SELECT DB RESULTS GROUP BY DBID, DB ORDER BY DBID");
145
// while(rsDbs.next()) {
146
// writer.println("<th>" + rsDbs.getString(1) + "</th>");
147
// }
148
// ResultSet rs = conn.createStatement().executeQuery("SELECT TEST, UNIT FROM RESULTS GROUP BY TESTID, TEST, UNIT ORDER BY TESTID");
149
// while(rs.next()) {
150
// writer.println("<tr><td>" + rs.getString(1) + "</td>");
151
// writer.println("<td>" + rs.getString(2) + "</td>");
152
// ResultSet rsRes = conn.createStatement().executeQuery("SELECT RESULT FROM RESULTS WHERE TESTID=? ORDER BY DBID");
153
//
154
//
155
// }
156

157 // PrintWriter writer = new PrintWriter(new FileWriter("benchmark.html"));
158
// writer.println("<table><tr><th>Test Case</th><th>Unit</th>");
159
// for(int j=0; j<dbs.size(); j++) {
160
// Database db = (Database)dbs.get(j);
161
// writer.println("<th>" + db.getName() + "</th>");
162
// }
163
// writer.println("</tr>");
164
// for(int i=0; i<results.size(); i++) {
165
// Object[] res = (Object[])results.get(i);
166
// writer.println("<tr><td>" + res[0] + "</td>");
167
// writer.println("<td>" + res[1] + "</td>");
168
// for(int j=0; j<dbs.size(); j++) {
169
// Database db = (Database)dbs.get(j);
170
// ArrayList r = db.getResults();
171
// Object[] v = (Object[])r.get(i);
172
// writer.println("<td style=\"text-align: right\">" + v[2] + "</td>");
173
// }
174
// writer.println("</tr>");
175
// }
176
// writer.println("</table>");
177

178         System.out.println("Test finished");
179         System.exit(0);
180     }
181     
182     private void testAll(ArrayList JavaDoc dbs, ArrayList JavaDoc tests, int size) throws Exception JavaDoc {
183         for(int i=0; i<dbs.size(); i++) {
184             if(i>0) {
185                 Thread.sleep(1000);
186             }
187             // calls garbage collection
188
TestBase.getMemoryUsed();
189             Database db = (Database)dbs.get(i);
190             System.out.println("testing " + db.getName());
191             db.startServer();
192             Connection JavaDoc 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 JavaDoc tests, int size) throws Exception JavaDoc {
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 JavaDoc {
214         bench.init(db, size);
215         bench.run();
216     }
217
218 }
219
Popular Tags