Hi Thomas, thanks a lot for your very helpful tips - now, I'm fairly sure to be able to accelerate writing out of my svg content to files :-)
Best regards, Maik ----- Original Message ----- From: "Thomas DeWeese" <[EMAIL PROTECTED]> To: "Batik Users" <[EMAIL PROTECTED]> Sent: Saturday, February 14, 2004 7:05 PM Subject: Re: storing SVG DOM tree contents to a file by method org.apache.batik.svggen.SVGGraphics2D.stream(...) very slow ! > Magic Finger wrote: > > > I've put some simple checkpoints to the different methods called by > > SVGGraphics2D.stream(...) and saw that the methods for writing out the xml > > entity *attributes* (writeXml(Attr attr, IndentWriter out) and > > writeChildrenXml(Attr attr, IndentWriter out) inside class > > org.apache.batik.svggen.XmlWriter) are called very often and slow down the > > file writing process mostly. > > Well it isn't surprising that the part of the code that writes > most of the output takes most of the time, but looking at the code > it is possible that it could be sped up. > > In particular if the writeChildrenXML call was rewritten so > it got a 'char []' from the string and instead of calling > 'write(c)' it collected runs of unsubsititued chars and called > 'write(chars, start, len)' this might significantly reduce the > overhead. You could also look at alternatives to the 'switch' > so a clever set of 'if' constructs might be quicker in the most > common cases. I know that for C/C++ this is seldom the case. > > > In my case the xml attributes are the x,y coordinates and the stroke-info > > for a 2d line: > > <line fill="none" x1="273.5316" x2="231.6523" y1="665.7648" y2="327.1585" > > stroke="black" stroke-width="2" /> > > And I have to store very often more than 20.000 lines. > > So I have to wonder a little at this. You might consider > using a 'path' element. If your lines are often 'connected' > (i.e. x2,y2 of one line === x1,y1 of the next) this would > almost certainly be better all around, smaller file, faster > read/write and probably faster render. > > If you are using SVGGraphics2D for everything you would > need to use 'java.awt.geom.GeneralPath'. > > > Best regards, > > Maik > > > > > > ----- Original Message ----- > > From: "Thomas DeWeese" <[EMAIL PROTECTED]> > > To: "Batik Users" <[EMAIL PROTECTED]> > > Sent: Wednesday, February 11, 2004 11:06 PM > > Subject: Re: storing SVG DOM tree contents to a file by method > > org.apache.batik.svggen.SVGGraphics2D.stream(...) very slow ! > > > > > > > >>Magic Finger wrote: > >> > >> > >>>Thanks for your help Bibek, but unfortunately no elements were written > > > > out > > > >>>to SVG file when replacing in my code shown below the statement > >> > >> This is one of the more common mistakes with the SVGGraphics2D, > >>the factory document is used as just that - a factory. It does not > >>append the elements to that document. If you want the document > >>tree from the SVGGraphics2D you need to use 'getRoot'. Note that this > >>'clears' the SVGGraphics2D so if you are 'check pointing' the work > >>you need to store the element returned (not that I think this applies > >>here). > >> > >> BTW I don't think it will be much faster. If you are really > >>concerned about performance you should run a profiler on the code > >>and see what pops out. Could be simple stuff like not using > >>StringBuffer where we should, but who knows without profiling you > >>are generally just "shooting in the dark". > >> > >> > >>> svgGenerator.stream(out, useCSS); > >>>by your alternative suggestion > >>> DOMUtilities.writeDocument(myFactory, out); > >>> > >>>It seems that 'myFactory' (which is an instance of org.w3c.dom.Document) > >>>contains no Node elements -- very strange !? > >>> > >>>Best regards, > >>>Maik > >>> > >>> > >>>----- Original Message ----- > >>>From: "Bibek Sahu" <[EMAIL PROTECTED]> > >>>To: "Batik Users" <[EMAIL PROTECTED]> > >>>Sent: Friday, February 06, 2004 4:23 PM > >>>Subject: Re: storing SVG DOM tree contents to a file by method > >>>org.apache.batik.svggen.SVGGraphics2D.stream(...) very slow ! > >>> > >>> > >>> > >>> > >>>>Another way is to use > >> > >>>org.apache.batik.dom.util.DOMUtilities.writeDocument(org.w3c.dom.Document > >>> > >>>doc, java.io.Writer w) > >>> > >>> > >>>>Don't know whether it's faster or not, but it's worth a shot. It works > >>>>pretty well for me, but my SVGs are smaller than yours... > >>>> > >>>>Good luck! > >>>>- Bibek > >>>> > >>>> > >>>>On Fri, 6 Feb 2004, Magic Finger wrote: > >>>> > >>>> > >>>> > >>>>>Hello, > >>>>> > >>>>>I have serious performance problems when writing out the SVG DOM tree > > > > by > > > >>>the > >>> > >>> > >>>>>Batik SVG-Generator method > >>>>>org.apache.batik.svggen.SVGGraphics2D.stream(...). > >>>>> > >>>>>Writing out ~ 20.000 lines to a SVG file by method > >>> > >>>SVGGraphics2D.stream(...) > >>> > >>> > >>>>>with BufferedWriter takes ~3 minutes -- that's unbelievable slow. > >>>>>The resulting size of the SVG file is ~1.3 MB. > >>>>> > >>>>>Does anybody can tell me how to accelerate file writing, or is it just > > > > a > > > >>>>>normal, poor behaviour of Batik's internal SVGGraphics2D.XmlWriter ? > >>>>> > >>>>>And any idea how to give a "I am working..." feedback to users while > >>>>>streaming out the DOM tree contents to an SVG file, e.g. by showing a > >>>>>progressbar ? > >>>>> > >>>>>The DOM tree contents are just lines and the resulting SVG file looks > >>> > >>>like > >>> > >>> > >>>>>this: > >>>> > >>>------------------------------------------------------------------------- - > >>> > >>>>><?xml version="1.0"?> > >>>>> > >>>>><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN' > >>>>>'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'> > >>>>><svg fill-opacity="1" xmlns:xlink="http://www.w3.org/1999/xlink" > >>>>>color-rendering="auto" color-interpolation="auto" text-rendering="auto" > >>>>>stroke="black" stroke- linecap="square" stroke-miterlimit="10" > >>>>>shape-rendering="auto" stroke-opacity="1" fill="black" > >>>>>stroke-dasharray="none" font-weight="normal" stroke-width="1" > >>>>>xmlns="http://www.w3.org/2000/svg" font-family="'sansserif'" > >>>>>font-style="normal" stroke-linejoin="miter" font-size="12" > >>>>>stroke-dashoffset="0" image-rendering="auto"> > >>>>> <!--Generated by Foo--> > >>>>> <defs id="genericDefs" /> > >>>>> <g> > >>>>> <g fill="white" stroke="white"> > >>>>> <rect width="562" x="0" height="378" y="0" stroke="none" /> > >>>>> </g> > >>>>> <g stroke-linecap="round" fill="rgb(204,255,204)" > >>>>>text-rendering="optimizeLegibility" stroke-linejoin="round" > >>>>>stroke="rgb(204,255,204)" stroke- width="0.375"> > >>>>> <line y2="217" fill="none" x1="222" x2="222" y1="217" /> > >>>>> ... > >>>>> <line fill="none" x1="60" x2="61" y1="153" y2="153" stroke="blue" > >>>>>stroke-width="0.5" /> > >>>>> ... > >>>>> <line fill="none" x1="477" x2="477" y1="258" y2="258" > >>> > >>>stroke="black" > >>> > >>> > >>>>>stroke-width="2" /> > >>>>> ... > >>>>> </g> > >>>>> </g> > >>>>></svg> > >>>> > >>>------------------------------------------------------------------------- - > >>> > >>>>>The lines were generated for a JPanel by explicetely calling its > >>>>>paintComponent(Graphics g) method with an instance of SVGGraphics2D as > >>> > >>>the > >>> > >>> > >>>>>parameter 'g' (please see code snippets below): > >>>> > >>>------------------------------------------------------------------------- - > >>> > >>>>> ... > >>>>> File svgFile; > >>>>> ... > >>>>> DOMImplementation domImpl = > >>>>>GenericDOMImplementation.getDOMImplementation(); > >>>>> Document myFactory = > >>>>>domImpl.createDocument(/*null*/SVGDOMImplementation.SVG_NAMESPACE_URI, > >>>>>"svg", null); > >>>>> SVGGeneratorContext ctx = > >>> > >>>SVGGeneratorContext.createDefault(myFactory); > >>> > >>> > >>>>> ctx.setComment("Generated by Foo"); > >>>>> > >>>>> SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx, false); > >>>>> ... > >>>>> MyJPanel panel = new MyJPanel(); > >>>>> .... > >>>>> panel.paintComponent(svgGenerator); > >>>>> .... > >>>>> FileOutputStream fileout = new FileOutputStream(svgFile); > >>>>> Writer out = new BufferedWriter(new OutputStreamWriter(fileout, > >>>>>"UTF-8"), 131072/*buffersize=128kB*/); > >>>>> > >>>>> boolean useCSS = false; // CSS style attribute > >>>>> svgGenerator.stream(out, useCSS); > >>>>> ... > >>>> > >>>------------------------------------------------------------------------- - > >>> > >>>>> class MyJPanel extends JPanel { > >>>>> ... > >>>>> BasicStroke strokeLine = new BasicStroke(thicknessLine, > >>>>>BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); > >>>>> ... > >>>>> > >>>>> public void paintComponent(Graphics g) { > >>>>> > >>>>> Graphics2D g2 = (Graphics2D) g; > >>>>> > >>>>> int maxX = this.getSize().width; > >>>>> int maxY = this.getSize().height; > >>>>> > >>>>> // set white background > >>>>> g2.setColor(Color.white); > >>>>> g2.fillRect(0, 0, maxX, maxY); > >>>>> > >>>>> ... > >>>>> // loop over ~ 20.000 lines with different colors and > >>> > >>>strokes > >>> > >>> > >>>>>... > >>>>> g2.setColor(colorLine); > >>>>> g2.setStroke(strokeLine); > >>>>> g2.draw(new Line2D.Double(line[i].startX, line[i].startY, > >>>>>line[i].endX, line[i].endY)); > >>>>> ... > >>>>> } > >>>>> } > >>>> > >>>------------------------------------------------------------------------- - > >>> > >>>>>Thanks in advance for any help or tips !!! > >>>>> > >>>>>Maik Diergardt > >>>>>extreme.soft > >>>>> > >>>>> > >>>>>--------------------------------------------------------------------- > >>>>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>>>For additional commands, e-mail: [EMAIL PROTECTED] > >>>>> > >>>> > >>>> > >>>>--------------------------------------------------------------------- > >>>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>>For additional commands, e-mail: [EMAIL PROTECTED] > >>>> > >>> > >>> > >>> > >>>--------------------------------------------------------------------- > >>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>For additional commands, e-mail: [EMAIL PROTECTED] > >>> > >> > >> > >> > >> > >>--------------------------------------------------------------------- > >>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>For additional commands, e-mail: [EMAIL PROTECTED] > >> > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
