transformer.transform(new DOMSource(doc), new StreamResult(baos));
and the difference is substantial. Running in eClipse the average time
taken is usually 60-80ms whereas within the app server its 700-800ms.
I'm at a loss to understand what could be causing a 10 fold increase
in the time taken for exactly the same code. Are there any JVM or
other settings that might be causing this ?
To be certain that the App Server (and eClipse) were picking up the
Saxon JARs and not some other parser I included in the output the
vendor name and version, which in both cases reported :-
<!--XSLT vendor: SAXON 9.1.0.6 from Saxonica, XSLT version: 2.0, XSLT
vendor URL: http://www.saxonica.com/-->
Some example code and outputs below ..
Regards
Fraser.
Example code perfroming the transform (including some timing output) :-
public String transformXml(String inputXml, String xslFilePath, Vector
paramsVector,) throws Exception {
long transformstart = System.currentTimeMillis();
long start = System.currentTimeMillis();
long end = 0L;
long totalTime = 0L;
ByteArrayInputStream bais = new
ByteArrayInputStream(inputXml.getBytes(stringEncoding));
InputSource in = new InputSource(bais);
DocumentBuilderFactory dfactory =
DocumentBuilderFactory.newInstance();
dfactory.setNamespaceAware(true);
Document doc = dfactory.newDocumentBuilder().parse(in);
end = System.currentTimeMillis();
totalTime = end - start;
System.out.println("Time to parse input: " + totalTime);
start = System.currentTimeMillis();
TransformerFactory tFactory = cachingTransformerFactory;
Transformer transformer;
transformer = tFactory.newTransformer(new
StreamSource(new File(xslFilePath)));
transformer.clearParameters();
end = System.currentTimeMillis();
totalTime = end - start;
System.out.println("Time to create transformer: " + totalTime);
start = System.currentTimeMillis();
// Create an instance of the wbimb URI Resolver
URIResolver objResolver = new MessageBrokerURIResolver();
transformer.setURIResolver(objResolver);
end = System.currentTimeMillis();
totalTime = end - start;
System.out.println("Time to set URIResolver: " + totalTime);
start = System.currentTimeMillis();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//set parameters
for (int x = 0; x < paramsVector.size(); x++) {
Parameter param = (Parameter) paramsVector.get(x);
transformer.setParameter(param.name, param.value);
}
end = System.currentTimeMillis();
totalTime = end - start;
System.out.println("Time to parse params: " + totalTime);
start = System.currentTimeMillis();
/******* THIS IS WHERE MOST OF THE TIME TAKEN IS ********/
transformer.transform(new DOMSource(doc), new
StreamResult(baos));
end = System.currentTimeMillis();
totalTime = end - start;
System.out.println("Time to perform transform: " + totalTime);
start = System.currentTimeMillis();
baos.close();
byte[] data = baos.toByteArray();
String outputString = null;
try {
outputString = new String(data, stringEncoding);
} catch (Exception e) {
String message = "Got Exception converting the
output of transform to String using encoding: " + stringEncoding;
throw new Exception(message);
}
end = System.currentTimeMillis();
totalTime = end - start;
System.out.println("Time to convert the output of the
transform to a String: " + totalTime);
long transformend = System.currentTimeMillis();
long transformtotalTime = transformend - transformstart;
System.out.println("Total time to run XSLT: " +
transformtotalTime);
return outputString;
}
... and this is some typical output from running in eClipse (I'm
running 20 iterations here) :-
===================================================
TEST : validResponse_CachedStylesheet
===================================================
Time to parse input: 172
Time to create transformer: 547
Time to set URIResolver: 0
Time to parse params: 0
Time to perform transform: 187
Time to convert the output of the transform to a String: 0
Total time to run XSLT: 906
Time to parse input: 0
Time to create transformer: 0
Time to set URIResolver: 0
Time to parse params: 0
Time to perform transform: 94
Time to convert the output of the transform to a String: 0
Total time to run XSLT: 94
Time to parse input: 0
Time to create transformer: 0
Time to set URIResolver: 0
Time to parse params: 0
Time to perform transform: 78
Time to convert the output of the transform to a String: 0
Total time to run XSLT: 78
Time to parse input: 0
Time to create transformer: 0
Time to set URIResolver: 0
Time to parse params: 0
Time to perform transform: 78
Time to convert the output of the transform to a String: 0
Total time to run XSLT: 78
...
Total time to run XSLT for (20) iterations : 2500
Average time to run XSLT for (20) iterations : 125
Heres some Log4j output from running the same code in the App Server
(note the LAST entry - 735ms) :-
<PrimaryLogText>CachingTransformerFactory: Entry for file [C:\Program
Files\IBM\MQSI\6.1\bin\..\config\flows\service\exceedinboundadapter\resources\retrievepolicysummarylistbyclientref\validation\validateResponse.xslt]
FOUND in CACHE..</PrimaryLogText>
<PrimaryLogText>CachingTransformerFactory: Using CACHED stylesheet
[C:\Program Files\IBM\MQSI\6.1\bin\..\config\flows\service\exceedinboundadapter\resources\retrievepolicysummarylistbyclientref\validation\validateResponse.xslt]..</PrimaryLogText>
<PrimaryLogText>eXSLTPerformance.EnhancedXMLTransformationNode: Time
to create transformer: 0.</PrimaryLogText>
<PrimaryLogText>eXSLTPerformance.EnhancedXMLTransformationNode: Time
to set URIResolver: 0.</PrimaryLogText>
<PrimaryLogText>eXSLTPerformance.EnhancedXMLTransformationNode: Time
to parse params: 0.</PrimaryLogText>
<PrimaryLogText>eXSLTPerformance.EnhancedXMLTransformationNode: Time
to perfrom transform: 735.</PrimaryLogText>