I decided to find a demonstration program that works
similar enough to FOP that I could try the String.intern()
technique.

1) SAXTreeValidator.java from Chapter 3 of Brett McLaughlin's
   "XML and Java" the online copy of the example is 2nd Ed.

2) Fed this program various fragments of .fo files I have
   accumulated lately.

3) There was one line I had to change in the program

   Line 355: if (attPrefix == null || attPrefix.equals("")) {
   had to add test for null as the prog threw NPE.

4) Changed the handling of strings at the for-loop storing the
   attributes received from the parser in startElement( ... )

        // Process attributes
        for (int i=0; i<atts.getLength(); i++) {
            DefaultMutableTreeNode attribute =
                new DefaultMutableTreeNode(("Attribute (name = '" +
                                           atts.getLocalName(i) + 
                                           "', value = '" +
                                           atts.getValue(i) +
"')").intern() );

    So I intern these strings rather than storing new strings.

5) Tested this program with this particular call to 'intern'
   enabled and disabled. With my 'defguide.fo' file from
   styling "DocBook: The Definitive Guide"

   The results:

        interned attributes:  87M reported by 'top' in column RSS
        non-interned strings 184M reported by 'top'

6) Speed was about the same ('time' reported 27 and 30 second 'user')


7) I ran a similar test in the JMP profiler with a much smaller 
   .fo file. AT the end of execution I determined that the heap
   was about 4.8M for the non-interned code and 2.8M for the interned.


Conclusion: Interning strings in FOP will help. I believe the code
to change is in FOTree.java.

I will code up an example and test it in a day or so.

 
-- 

John Austin <[EMAIL PROTECTED]>

Reply via email to