/**
* Copyright 2015 Santhosh Kumar Tekuri
*
* The JLibs authors license 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 jlibs.examples.xml.sax.dog.tests;
import jlibs.core.io.FileNavigator;
import jlibs.core.io.FileUtil;
import jlibs.core.lang.JavaProcessBuilder;
import jlibs.core.util.logging.AnsiFormatter;
import jlibs.examples.xml.sax.dog.TestCase;
import jlibs.examples.xml.sax.dog.TestSuite;
import java.io.*;
/**
* @author Santhosh Kumar T
*/
public class XPathPerformanceTest{
private static final int runCount = 20;
private TestSuite testSuite;
public XPathPerformanceTest(TestSuite testSuite){
this.testSuite = testSuite;
}
public void run(boolean cumulative, boolean xmlDog) throws Exception{
long stats[] = new long[testSuite.testCases.size()];
if(cumulative){
for(int i=0; i<testSuite.testCases.size(); i++){
TestCase testCase = testSuite.testCases.get(i);
for(int count=0; count<runCount; count++){
long time = System.nanoTime();
if(xmlDog)
testCase.usingXMLDog();
else
testCase.usingDOM();
time = System.nanoTime() - time;
stats[i] += time;
if(xmlDog)
testCase.dogResult = null;
else
testCase.jdkResult = null;
}
}
}else{
for(int count=0; count<runCount; count++){
for(int i=0; i<testSuite.testCases.size(); i++){
TestCase testCase = testSuite.testCases.get(i);
long time = System.nanoTime();
if(xmlDog)
testCase.usingXMLDog();
else
testCase.usingDOM();
time = System.nanoTime() - time;
stats[i] += time;
if(xmlDog)
testCase.dogResult = null;
else
testCase.jdkResult = null;
}
}
}
BufferedWriter writer = new BufferedWriter(new FileWriter(FileUtil.TMP_DIR+FileUtil.SEPARATOR+xmlDog+".txt"));
for(long stat: stats){
writer.write(String.valueOf(stat/runCount));
writer.newLine();
}
writer.close();
}
private static void printLine(int maxlen){
maxlen += 41;
for(int i=0; i<maxlen; i++)
System.out.print("-");
System.out.println();
}
private static void printStat(int maxlen, String file, int xpaths, long dogTime, long domTime){
long diff = dogTime - domTime;
double faster = (1.0*Math.max(dogTime, domTime)/Math.min(dogTime, domTime)) * (dogTime<=domTime ? -1 : +1);
(diff>=0?AnsiFormatter.SEVERE:AnsiFormatter.INFO).outFormat("%"+maxlen+"s | %6d %6d %6d %6d %+2.2f%n", file, xpaths, (long)(dogTime*1E-06), (long)(domTime*1E-06), (long)(diff*1E-06), faster);
}
public static void main(String[] args) throws Exception{
if(args.length==0)
args = new String[]{ TestSuite.DEFAULT_TEST_SUITE };
if(args.length==1){
JavaProcessBuilder jvm = new JavaProcessBuilder()
.jvmArg("-server")
.jvmArg("-classpath")
.jvmArg(System.getProperty("java.class.path"))
.mainClass(XPathPerformanceTest.class.getName())
.arg(args[0]);
jvm.arg("true");
System.out.format("%6s............", "XMLDog");
if(jvm.launch(System.out, System.err).waitFor()!=0)
return;
System.out.println(" Done");
System.out.format("%6s............", TestCase.domEngine.getName());
jvm.args().set(jvm.args().size()-1, "false");
if(jvm.launch(System.out, System.err).waitFor()!=0)
return;
System.out.println(" Done");
TestSuite testSuite = new TestSuite(args[0]);
BufferedReader dogReader = new BufferedReader(new FileReader(FileUtil.TMP_DIR+FileUtil.SEPARATOR+"true.txt"));
BufferedReader domReader = new BufferedReader(new FileReader(FileUtil.TMP_DIR+FileUtil.SEPARATOR+"false.txt"));
File configFile = new File(args[0]);
int maxlen = 0;
for(TestCase testCase: testSuite.testCases){
testCase.file = FileNavigator.INSTANCE.getRelativePath(configFile.getParentFile(), new File(testCase.file));
maxlen = Math.max(maxlen, testCase.file.length());
}
System.out.format("%nAverage Execution Time over %d runs:%n", runCount);
printLine(maxlen);
System.out.format("%"+maxlen+"s | %6s %6s %6s %6s %6s%n", "File", "XPaths", "XMLDog", TestCase.domEngine.getName(), "Diff", "Percentage");
printLine(maxlen);
long dogTotal = 0;
long domTotal = 0;
for(TestCase testCase: testSuite.testCases){
long dogTime = Long.parseLong(dogReader.readLine());
long domTime = Long.parseLong(domReader.readLine());
printStat(maxlen, testCase.file, testCase.xpaths.size(), dogTime, domTime);
dogTotal += dogTime;
domTotal += domTime;
}
printLine(maxlen);
printStat(maxlen, "Total", testSuite.total, dogTotal, domTotal);
dogReader.close();
domReader.close();
}else if(args.length==2){
TestSuite testSuite = new TestSuite(args[0]);
new XPathPerformanceTest(testSuite).run(true, args[1].equals("true"));
}
}
}