<div dir="ltr">On Sat, Mar 30, 2013 at 2:01 PM, Laurent Bourgès <span dir="ltr"><<a href="mailto:bourges.laurent@gmail.com" target="_blank">bourges.laurent@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">- clipping issues (dasher, stroker) and spatial resolution (no cpu/memory waste)<br>
</blockquote><div><br></div><div style>I see, yes. Indeed in the GeoServer code we already work around some of those issues by</div><div style>clipping the geometries read from the database to the graphics2d viewport before giving them</div>
<div style>to the renderer, we had to do that both for performance issues and to avoid OOM errors</div><div style>when basic stroke with dasharray is used against a line that is many times longer than the</div><div style>
current display area</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="gmail_quote">
<div class="im"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">
<div>I don't have anything ready, the existing code loads data from spatial database, sets up styles from XML descriptions, turns each spatial db geomety in java shapes</div>


<div>and so on. But I guess I could concoct something close enough.</div><div>I'm writing some code to gather statistics about the shapes that are actually painted (scrolling over the path iterators) and then I'll try to make a randomized</div>


<div>shape painter that gets close to those stats.</div></div></div></div></blockquote></div><div><br>Great news ! I am waiting your test code to perform few benchmarks.<br><br>I am using J2DBench but it does not perform such complex drawing (complex shapes ...) or multi threading tests (parallel drawings on buffered images)</div>
</div></blockquote><div><br></div><div style>Ok, I've created a "MapBench" by serializing shapes, strokes and fills from a real GeoServer instance to disk, and have them</div><div style>play in a simple multithreaded test harness.</div>
<div style>What you get in the output is not exactly the maps generated by GeoServer since we use a number of tricks to speed up rendering,</div><div style>including painting over multiple drawing surfaces (the serializer only handles one), also, some maps have text showing up because</div>
<div style>in order to pain "labels along a line" we actually turn the chars into shapes and place them along the line, but those labels that we</div><div style>can predict are "straight" are painted with drawGlyphVector so they won't show up (haven't built a serialization for that case).</div>
<div style><br></div><div style>Regardless, the test should be good enough to test both performance and scalability.</div><div style>Here is the package: <a href="http://demo.geo-solutions.it/share/mapbench.zip">http://demo.geo-solutions.it/share/mapbench.zip</a></div>
<div style><br></div><div style>It contains:</div><div style>* ShapeDumpingGraphics2D, a Graphics2D wrapper writing on disk all draw(Shape) and</div><div style>  fill(Shape) commands issued to it</div><div style>* A bunch of *.ser files, that are the serialized drawing command sequences</div>
<div style>* A bunch of *.png files, which are the rendered versions of the .ser files (for reference)</div><div style>* MapDisplay, which reads all *.ser files from a directory and displays them in JFrame and</div><div style>
   generates the .png files as well</div><div style>* MapBench, which reads all *.ser files from a directory and repeatedly paints them in a loop</div><div style>  with a growing number of threads </div><div style>* Two txt files with the timings of the benchmarks on my machine for Oracle JDK 7 and </div>
<div style>   OpenJDK 7, here is an example comparison:</div><div style><br></div><div style>OpenJDK7:</div><div style><div>Testing file /tmp/dc_boulder_2013-13-30-06-13-17.ser</div><div>1 threads and 20 loops per thread, time: 3340 ms</div>
<div>2 threads and 20 loops per thread, time: 3688 ms</div><div>4 threads and 20 loops per thread, time: 4665 ms</div><div>8 threads and 20 loops per thread, time: 7343 ms</div><div><br></div><div style>Oracle JDK 7:</div>
<div style><div>Warm up took 29516 ms<br></div><div>Testing file /tmp/dc_boulder_2013-13-30-06-13-17.ser</div><div>1 threads and 20 loops per thread, time: 1754 ms</div><div>2 threads and 20 loops per thread, time: 2878 ms</div>
<div>4 threads and 20 loops per thread, time: 6792 ms</div><div>8 threads and 20 loops per thread, time: 14275 ms</div></div><div><br></div><div style>As you can see ductus is significantly faster than pisces, but it has serious scalability</div>
<div style>issues, while pisces scales up a lot better.</div><div style><br></div><div style>The code has been put together in a haste, sorry for the lack of comments, hopefully it is</div><div style>simple enough that it's usable anyways.</div>
<div style><br></div><div style>Cheers</div><div style>Andrea</div><div><br></div></div></div><div><br></div>-- <br><div>==</div><div>Our support, Your Success! Visit <a href="http://opensdi.geo-solutions.it" target="_blank">http://opensdi.geo-solutions.it</a> for more information.</div>
<div>==</div><div><br></div><div>Ing. Andrea Aime </div><div>@geowolf</div><div>Technical Lead</div><div><br></div><div>GeoSolutions S.A.S.</div><div>Via Poggio alle Viti 1187</div><div>55054  Massarosa (LU)</div><div>Italy</div>
<div>phone: +39 0584 962313</div><div>fax: +39 0584 1660272</div><div>mob: +39  339 8844549</div><div><br></div><div><a href="http://www.geo-solutions.it" target="_blank">http://www.geo-solutions.it</a></div><div><a href="http://twitter.com/geosolutions_it" target="_blank">http://twitter.com/geosolutions_it</a></div>
<div><br></div><div>-------------------------------------------------------</div>
</div></div>