"One of the common misconceptions about writing XML applications is
that creating a parser instance does not incur a large performance
cost. "

Thanks Michael, I was under that common misconception.

I'll tell my colleague that he does need to pool the parsers after all.

cheers
andrew


On 12 November 2013 19:18, Michael Glavassevich <mrgla...@ca.ibm.com> wrote:
> Hi Andrew,
>
> Creating a new XML parser can be very expensive. The ClassLoader used to
> create the parser and its internal components might block or spend a long
> time searching its "classpath" for META-INF/services files. This is why
> it's generally a good idea to cache and reuse [1] XML parser instances.
>
> Thanks.
>
> [1]
> http://www.ibm.com/developerworks/xml/library/x-perfap2/index.html#reuse
>
> Michael Glavassevich
> XML Technologies and WAS Development
> IBM Toronto Lab
> E-mail: mrgla...@ca.ibm.com
> E-mail: mrgla...@apache.org
>
> Andrew Welch <andrew.j.we...@gmail.com> wrote on 11/12/2013 07:48:47 AM:
>
>> Hi,
>>
>> A colleague was doing some performance testing and discovered some
>> contention at this line of my code:
>>
>> XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
>>
>> ...which was surprising : ) He informed me it was doing a blocking
>> operation every time.
>>
>> Anyway, he went away and went through the Xerces source and found that
>> if the "org.apache.xerces.xni.parser.XMLParserConfiguration" system
>> property is not set it does indeed do a blocking operation (in
>> parsers.ObjectFactory)
>>
>> To demonstrate this, run the below code with and without the system
>> property set:
>>
>> public static void main(String... args) throws Exception {
>>
>>     //System.setProperty
>> ("org.apache.xerces.xni.parser.XMLParserConfiguration",
>>     //        "org.apache.xerces.parsers.XIncludeParserConfiguration");
>>
>>     long start = System.nanoTime();
>>
>>     for (int i = 0; i <= 10000; i++) {
>>         XMLReaderFactory.createXMLReader
>> ("org.apache.xerces.parsers.SAXParser");
>>     }
>>
>>     long end = System.nanoTime();
>>     double millis = (end - start) * 1e-6;
>>
>>     System.out.println(millis);
>>
>> }
>>
>> On my machine it consistently takes around ~2000ms without the system
>> property, and ~1300ms with.
>>
>> This is present in both 2.9 and 2.11 as far as I can see.
>>
>>
>>
>>
>> --
>> Andrew Welch
>> http://andrewjwelch.com
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: j-users-unsubscr...@xerces.apache.org
>> For additional commands, e-mail: j-users-h...@xerces.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: j-users-unsubscr...@xerces.apache.org
> For additional commands, e-mail: j-users-h...@xerces.apache.org
>



-- 
Andrew Welch
http://andrewjwelch.com

---------------------------------------------------------------------
To unsubscribe, e-mail: j-users-unsubscr...@xerces.apache.org
For additional commands, e-mail: j-users-h...@xerces.apache.org

Reply via email to