Andra & Jim, Here is the current status of my patch alpha version: http://jmmc.fr/~bourgesl/share/java2d-pisces/
There is still a lot to be done: clean-up, stats, pisces class instance recycling (renderer, stroker ...) and of course sizing correctly initial arrays (dirty or clean) in the RendererContext (thread local storage). For performance reasons, I am using now RendererContext members first (cache for rowAARLE for example) before using ArrayCaches (dynamic arrays). I provided the patch as zip file and few benchmark using Andrea's MapBench (Xmx128m): - OpenJDK 8 PATCHED: Testing file /home/bourgesl/libs/openjdk/mapbench/dc_boulder_2013-13-30-06-13-17.ser 1 threads and 20 loops per thread, time: 3687 ms 2 threads and 20 loops per thread, time: 3693 ms 4 threads and 20 loops per thread, time: 6849 ms Loading drawing commands from file: /home/bourgesl/libs/openjdk/mapbench/dc_shp_alllayers_2013-00-30-07-00-47.ser Loaded DrawingCommands: DrawingCommands{width=1400, height=800, commands=135213} Testing file /home/bourgesl/libs/openjdk/mapbench/dc_shp_alllayers_2013-00-30-07-00-47.ser 1 threads and 20 loops per thread, time: 27266 ms 2 threads and 20 loops per thread, time: 33628 ms 4 threads and 20 loops per thread, time: 61577 ms - OpenJDK 8 REFERENCE: Testing file /home/bourgesl/libs/openjdk/mapbench/dc_boulder_2013-13-30-06-13-17.ser 1 threads and 20 loops per thread, time: 3982 ms 2 threads and 20 loops per thread, time: 4852 ms 4 threads and 20 loops per thread, time: 8842 ms Loading drawing commands from file: /home/bourgesl/libs/openjdk/mapbench/dc_shp_alllayers_2013-00-30-07-00-47.ser Loaded DrawingCommands: DrawingCommands{width=1400, height=800, commands=135213} Testing file /home/bourgesl/libs/openjdk/mapbench/dc_shp_alllayers_2013-00-30-07-00-47.ser 1 threads and 20 loops per thread, time: 55889 ms 2 threads and 20 loops per thread, time: 77691 ms 4 threads and 20 loops per thread, time: 141981 ms - Oracle JDK8 DUCTUS: Testing file /home/bourgesl/libs/openjdk/mapbench/dc_boulder_2013-13-30-06-13-17.ser 1 threads and 20 loops per thread, time: 1894 ms 2 threads and 20 loops per thread, time: 3905 ms 4 threads and 20 loops per thread, time: 7485 ms Loading drawing commands from file: /home/bourgesl/libs/openjdk/mapbench/dc_shp_alllayers_2013-00-30-07-00-47.ser Loaded DrawingCommands: DrawingCommands{width=1400, height=800, commands=135213} Testing file /home/bourgesl/libs/openjdk/mapbench/dc_shp_alllayers_2013-00-30-07-00-47.ser 1 threads and 20 loops per thread, time: 20911 ms 2 threads and 20 loops per thread, time: 39297 ms 4 threads and 20 loops per thread, time: 103392 ms As you can see, patched openJdk8 performs better and it is very noticeable on big drawings (dc_shp_alllayers_2013-00-30-07-00-47.ser) and better than ductus with 2 threads !! Laurent 2013/3/30 Andrea Aime <andrea.a...@geo-solutions.it> > On Sat, Mar 30, 2013 at 2:01 PM, Laurent Bourgès < > bourges.laur...@gmail.com> wrote: > >> - clipping issues (dasher, stroker) and spatial resolution (no cpu/memory >> waste) >> > > I see, yes. Indeed in the GeoServer code we already work around some of > those issues by > clipping the geometries read from the database to the graphics2d viewport > before giving them > to the renderer, we had to do that both for performance issues and to > avoid OOM errors > when basic stroke with dasharray is used against a line that is many times > longer than the > current display area > > >> 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 >>> and so on. But I guess I could concoct something close enough. >>> 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 >>> shape painter that gets close to those stats. >>> >> >> Great news ! I am waiting your test code to perform few benchmarks. >> >> I am using J2DBench but it does not perform such complex drawing (complex >> shapes ...) or multi threading tests (parallel drawings on buffered images) >> > > Ok, I've created a "MapBench" by serializing shapes, strokes and fills > from a real GeoServer instance to disk, and have them > play in a simple multithreaded test harness. > 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, > including painting over multiple drawing surfaces (the serializer only > handles one), also, some maps have text showing up because > 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 > can predict are "straight" are painted with drawGlyphVector so they won't > show up (haven't built a serialization for that case). > > Regardless, the test should be good enough to test both performance and > scalability. > Here is the package: http://demo.geo-solutions.it/share/mapbench.zip > > It contains: > * ShapeDumpingGraphics2D, a Graphics2D wrapper writing on disk all > draw(Shape) and > fill(Shape) commands issued to it > * A bunch of *.ser files, that are the serialized drawing command sequences > * A bunch of *.png files, which are the rendered versions of the .ser > files (for reference) > * MapDisplay, which reads all *.ser files from a directory and displays > them in JFrame and > generates the .png files as well > * MapBench, which reads all *.ser files from a directory and repeatedly > paints them in a loop > with a growing number of threads > * Two txt files with the timings of the benchmarks on my machine for > Oracle JDK 7 and > OpenJDK 7, here is an example comparison: > > OpenJDK7: > Testing file /tmp/dc_boulder_2013-13-30-06-13-17.ser > 1 threads and 20 loops per thread, time: 3340 ms > 2 threads and 20 loops per thread, time: 3688 ms > 4 threads and 20 loops per thread, time: 4665 ms > 8 threads and 20 loops per thread, time: 7343 ms > > Oracle JDK 7: > Warm up took 29516 ms > Testing file /tmp/dc_boulder_2013-13-30-06-13-17.ser > 1 threads and 20 loops per thread, time: 1754 ms > 2 threads and 20 loops per thread, time: 2878 ms > 4 threads and 20 loops per thread, time: 6792 ms > 8 threads and 20 loops per thread, time: 14275 ms > > As you can see ductus is significantly faster than pisces, but it has > serious scalability > issues, while pisces scales up a lot better. > > The code has been put together in a haste, sorry for the lack of comments, > hopefully it is > simple enough that it's usable anyways. > > Cheers > Andrea > > > -- > == > Our support, Your Success! Visit http://opensdi.geo-solutions.it for more > information. > == > > Ing. Andrea Aime > @geowolf > Technical Lead > > GeoSolutions S.A.S. > Via Poggio alle Viti 1187 > 55054 Massarosa (LU) > Italy > phone: +39 0584 962313 > fax: +39 0584 1660272 > mob: +39 339 8844549 > > http://www.geo-solutions.it > http://twitter.com/geosolutions_it > > ------------------------------------------------------- >