> -----Original Message----- > From: Aleksander Slominski [mailto:aslom@cs.indiana.edu] > Sent: Thursday, October 04, 2001 10:15 PM > To: KUMAR,PANKAJ (HP-Cupertino,ex1) > Cc: 'SoapRMI' > Subject: Re: Benchmarking and Comparing Java based XML Processors ... > > > "KUMAR,PANKAJ (HP-Cupertino,ex1)" wrote: > > > What started as a simple curiosity about various ways of > accessing and > > manipulating XML in Java and comparing their runtime > efficiency and memory > > utilization has now become something I felt I could share > with others. I > > call it XPB4J -- XML Processing Benchmark for Java. > > > > Besides the XPB4J software, what may be of interest is the > perforamance > > figures that I have collected and analyzed for a simple > processing ( > > gathering certain structural statistics on XML data ) > using SAX API ( > > Xerces and Crimson), DOM API ( Xerces and Crimson), JDOM API (JDOM > > software), Pull Parser API (XPP software), XSL stylesheets > ( Xalan ) and > > Cocoon framework ( Cocoon2). > > > > Find more about it at http://www.pankaj-k.net/xpb4j and > drop me a line if > > you found it useful in anyway. > > hi, > > it is very interesting benchmark! as the author of XPP2 i have few > comments.first i could not find exact instruction on how to > reproduce results > - something like actual data samples and command line used > would be very > helpful (maybe script?). > > i have also some doubts about the way you are gathering time > information, > specifically in org.xperf.xpb.XPBDriver you have > > long total = 0; > for (int j = 1; j < loopCount; j++) > total += pm.execTime[j]; > long average = total/(loopCount - 1); > > that is not good as with typical timer resolution of 10 ms it > will cut off > time measurements and relative errors can be very high > (unless you use very > high resolution timer - there was some time ago JavaWorld > article about > accessing Windows timers through JNI ...) > > for example using your Data/rxgen.xml that is in zip file > from your website - > when running not 10 times but 1000 loopCount i get > measurement of zero (which > is obviously wrong unless parser is really fast. :-)) and > taking average of > zeros is not good to compute real average... > > i fixed this problem by doing thisin XPBDriver to collect > total time for all > runs without interruptions: > > private void process() > { > > for (int i = 0; i < argPMethods.size(); i++) > { > PMethod pm = (PMethod)argPMethods.elementAt(i); > > try > { > long start = System.currentTimeMillis(); > pm.process(ardr.loopCount, ardr.uris, ardr.gcFlag, > ardr.gcMeasuredFlag); > long end = System.currentTimeMillis(); > > totals[i] = end - start; > } > catch (Exception e) > { > System.err.println("processing failed for (" + pm.paName + > ", " + pm.name + > ") : " + e); > e.printStackTrace(System.err); > argPMethods.remove(i); // Exclude it from reporting !! > --i; > } > } > } > > and when formating results i am using floats :-) > > > long total = 0; > for (int j = 1; j < loopCount; j++) { > total += pm.execTime[j]; > } > float average = ((float)totals[i])/(loopCount - 1); > //long average = total/(loopCount - 1); > addField(sb, Float.toString(average), fsize); > > i have discovered what was causing XPP2 to run slowly. XPP2 > is designed to be > reused in pool therefore it is by default very greedy for > memory (will take > about 10% of total input size) but that compensates very well > when parser is > reused hundreds of times :-) however in your PullProcessor > you are not reuning > parser instances.. > > the other side-effect of this starategy is that when a lot > of new instances > of XPP2 is created a lot of meory is allocated therefore > running GC slows down > execution a lot and for XPP2 more than for other parsers > (such as SAX). > thereofre for speed test it is necessary to disable GC in args.xml >> and memory usage should be measured separetly IMHO > > by just doing this will show that for small input files XPP2 > is 50% faster > than SAX- see below !!! > > > \xpb4j-0.8>run -loopCount 1000 > C2_LIB is not set. Proceeding without Cocoon ... > CLASSPATH in use: > c:\jdk1.3\lib\tools.jar;;.\lib\crimson.jar;.\lib\jdom.jar;.\li > b\PullParser2_0_2.jar;.\build\xpb4j.jar > ----------------------- XMLBench 1.0 ---------------- > Garbage Collection Flag : false > GC in measurement Window : false > Iteration loop count : 1000 > Show Performance Metrics : true > Enabled (PActivity, PMethod) tuples: (xstat, sax) > (xstat, dom) (xstat, > pull) (xs > tat, jdom) > Run URIs: Data\rxgen.xml > ----------------------------------------------------- > Creating Processors ... > ... Created Processors. > Processing Started ... > ... Processing Completed. > Writing Performance Measurements to "pdata.xml" ... > Writing Processing Results to "results.xml" ... > Execution Time (in milli seconds):: > method Run#0 Run#143 Run#286 Run#429 Run#572 Run#715 > Run#858 Average > > -------------------------------------------------------------- > ---------- > sax 40 10 10 0 10 0 > 10 6.7867866 > > -------------------------------------------------------------- > ---------- > dom 120 0 10 10 10 10 > 10 7.7387385 > > -------------------------------------------------------------- > ---------- > pull 50 0 0 0 10 10 > 10 4.32032 > > -------------------------------------------------------------- > ---------- > jdom 100 10 10 10 10 10 > 10 9.112112 > > -------------------------------------------------------------- > ---------- > > when i enable GC results are dramtically different:- every > test is slower by > 300-1000% and results are changed considerabley !!! > > > \xpb4j-0.8>run -loopCount 1000 > C2_LIB is not set. Proceeding without Cocoon ... > CLASSPATH in use: > c:\jdk1.3\lib\tools.jar;;.\lib\crimson.jar;.\lib\jdom.jar;.\li > b\PullParser2_0_2.jar;.\build\xpb4j.jar > ----------------------- XMLBench 1.0 ---------------- > Garbage Collection Flag : true > GC in measurement Window : false > Iteration loop count : 1000 > Show Performance Metrics : true > Enabled (PActivity, PMethod) tuples: (xstat, sax) > (xstat, dom) (xstat, > pull) (xs > tat, jdom) > Run URIs: Data\rxgen.xml > ----------------------------------------------------- > Creating Processors ... > ... Created Processors. > Processing Started ... > executed class org.xperf.xpb.xstat.sax.SAXProcessor > process in 40218 ms > executed class org.xperf.xpb.xstat.dom.DOMProcessor > process in 45916 ms > executed class org.xperf.xpb.xstat.pull.PullProcessor > process in 44884 ms > executed class org.xperf.xpb.xstat.jdom.JDOMProcessor > process in 53898 ms > ... Processing Completed. > Writing Performance Measurements to "pdata.xml" ... > Writing Processing Results to "results.xml" ... > Execution Time (in milli seconds):: > method Run#0 Run#143 Run#286 Run#429 Run#572 Run#715 > Run#858 Average > > -------------------------------------------------------------- > ---------- > sax 30 10 0 20 0 10 > 10 40.25826 > > -------------------------------------------------------------- > ---------- > dom 110 10 10 10 0 10 > 0 45.961964 > > -------------------------------------------------------------- > ---------- > pull 30 0 10 0 10 10 > 0 44.92893 > > -------------------------------------------------------------- > ---------- > jdom 100 10 0 10 10 10 > 0 53.95195 > > -------------------------------------------------------------- > ---------- > Memory Used (in KB):: > method Run#0 Run#15 Run#30 Run#45 Run#60 Run#75 > Run#90 Average > > -------------------------------------------------------------- > ---------- > sax 135 107 107 107 107 107 107 > > -------------------------------------------------------------- > ---------- > dom 91 163 163 163 163 163 163 > > -------------------------------------------------------------- > ---------- > pull 321 115 115 115 115 115 115 > > -------------------------------------------------------------- > ---------- > jdom 413 186 186 186 186 186 186 > > -------------------------------------------------------------- > ---------- > > resuing XPP2 instances(ie. making XmlPullParser p a field > of PullProcesor > class) will result in decreasing memory usgae - now XPP2 is > smaller by 50% > than SAX2 and it is still for case when no parser instances > are reused ! for > identical test setup as above i get this memory numbers: > > Memory Used (in KB):: > method Run#0 Run#143 Run#286 Run#429 Run#572 Run#715 > Run#858 Average > > -------------------------------------------------------------- > ---------- > sax 135 107 107 107 107 107 107 > > -------------------------------------------------------------- > ---------- > dom 91 163 163 163 163 163 163 > > -------------------------------------------------------------- > ---------- > pull 134 61 61 61 61 61 61 > > -------------------------------------------------------------- > ---------- > jdom 413 186 186 186 186 186 186 > > -------------------------------------------------------------- > ---------- > > > > > > > > > and finally as of memory usage - modifying default memory > policy for XPP2 by > doing this: > > p.setSoftLimit(1* 1024); > p.setHardLimit(10* 1024); > > and using XPP2 for really big files shows that it can be > smaller than SAX2 - > for example running rxgen 10000 and using generated 3,670,178 > rxgen.xml file: > > > \xpb4j-0.8>run2 -loopCount 10 > C2_LIB is not set. Proceeding without Cocoon ... > CLASSPATH in use: > ..\..\Forge\codes\xsoap\java\PullParser\build\lib\PullParser2_ > > 1_1_ALPHA.jar;c:\jdk1.3\lib\tools.jar;;.\lib\crimson.jar;.\lib > \jdom.jar;.\build\ > xpb4j.jar > ----------------------- XMLBench 1.0 ---------------- > Garbage Collection Flag : true > GC in measurement Window : false > Iteration loop count : 10 > Show Performance Metrics : true > Enabled (PActivity, PMethod) tuples: (xstat, sax) > (xstat, dom) (xstat, > pull) (xs > tat, jdom) > Run URIs: Data\rxgen.xml > ----------------------------------------------------- > Creating Processors ... > ... Created Processors. > Processing Started ... > executed class org.xperf.xpb.xstat.sax.SAXProcessor > process in 6069 ms > executed class org.xperf.xpb.xstat.dom.DOMProcessor > process in 14070 ms > executed class org.xperf.xpb.xstat.pull.PullProcessor > process in 11617 ms > executed class org.xperf.xpb.xstat.jdom.JDOMProcessor > process in 20259 ms > ... Processing Completed. > Writing Performance Measurements to "pdata.xml" ... > Writing Processing Results to "results.xml" ... > Execution Time (in milli seconds):: > method Run#0 Run#2 Run#4 Run#6 Run#8 Average > -------------------------------------------------------- > sax 701 551 570 551 561 675.44446 > -------------------------------------------------------- > dom 1892 1432 1172 1672 1152 1563.3334 > -------------------------------------------------------- > pull 1222 1062 1061 1171 1162 1290.7778 > -------------------------------------------------------- > jdom 2914 1713 1833 2023 1723 2251.0 > -------------------------------------------------------- > Memory Used (in KB):: > method Run#0 Run#2 Run#4 Run#6 Run#8 Average > -------------------------------------------------------- > sax 533 497 497 497 497 > -------------------------------------------------------- > dom 13436 13088 13241 12468 13230 > -------------------------------------------------------- > pull 372 717 335 335 335 > -------------------------------------------------------- > jdom 13226 14147 14208 14340 13089 > -------------------------------------------------------- > > not using setSoft/HardLimit will result in following memory > utilization > > > Memory Used (in KB):: > method Run#0 Run#2 Run#4 Run#6 Run#8 Average > -------------------------------------------------------- > sax 533 497 497 497 497 > -------------------------------------------------------- > dom 13429 13088 13241 12473 13230 > -------------------------------------------------------- > pull 946 959 1038 1038 1038 > -------------------------------------------------------- > jdom 13163 13820 14147 14367 13240 > -------------------------------------------------------- > > also in PullProcessor you are allocating String for each > content (readContent) > but in SAX parser it is using only int len. version 2.1.x of > XPP2 has now > getContentLength() to avoid need to allocate String whne > youonly coolect > length/ > > i hope you will update your tests to have separate > performance run and memeory > runs (maybe with extra x seconds pause) and post results. > > thanks, > > alek > >