Last idea: I will enhance Andrea's mapBench benchmark to have statistics
per threads: number of loops, avg, min, max, stddev;

I guess that the total bench time is not so representative as the thread
pool can distribute the work load differently at each test => statistics
will help to have better timing / comparison between bench runs.

Regards,
Laurent

2013/4/11 Laurent Bourgès <bourges.laur...@gmail.com>

> Jim and Sergey,
>
> 1/ Here are few benchmarks (based on mapBench again) running several
> modified versions of AAShapePipe:
> http://jmmc.fr/~bourgesl/share/AAShapePipe/mapBench/
> - ref:
> 1 threads and 20 loops per thread, time: 3742 ms
> 2 threads and 20 loops per thread, time: 4756 ms
> 4 threads and 20 loops per thread, time: 8528 ms
>
> 1 threads and 20 loops per thread, time: 56264 ms
> 2 threads and 20 loops per thread, time: 75566 ms
> 4 threads and 20 loops per thread, time: 141546 ms
>
> - int4:
> 1 threads and 20 loops per thread, time: 3653 ms
> 2 threads and 20 loops per thread, time: 4684 ms
> 4 threads and 20 loops per thread, time: 8291 ms
>
> 1 threads and 20 loops per thread, time: 55950 ms
> 2 threads and 20 loops per thread, time: 74796 ms
> 4 threads and 20 loops per thread, time: 139924 ms
>
> - byte[]:
> 1 threads and 20 loops per thread, time: 3795 ms
> 2 threads and 20 loops per thread, time: 4605 ms
> 4 threads and 20 loops per thread, time: 8246 ms
>
> 1 threads and 20 loops per thread, time: 54961 ms
> 2 threads and 20 loops per thread, time: 72768 ms
> 4 threads and 20 loops per thread, time: 139430 ms
>
> - int4 / byte[] / rectangle cached in TileState:
> 1 threads and 20 loops per thread, time: 3610 ms
> 2 threads and 20 loops per thread, time: 4481 ms
> 4 threads and 20 loops per thread, time: 8225 ms
>
> 1 threads and 20 loops per thread, time: 54651 ms
> 2 threads and 20 loops per thread, time: 74516 ms
> 4 threads and 20 loops per thread, time: 140153 ms
>
> So you may be right, results are varying depending on the optimizations
> (int4, byte or all) !
> Maybe I should test different versions on optimized pisces renderer ...
>
> Here is an updated patch:
> http://jmmc.fr/~bourgesl/share/AAShapePipe/webrev-2/
>
>
> 2/ Thanks for your comments: actually a refactoring is possible to use a
> (shared) TileState instance replacing int[] bbox, rectangle bbox):
> - RenderingEngine.AATileGenerator getAATileGenerator(... int[] abox)
>
> it is very interesting here to propose an extensible tile state: maybe
> created by the renderer engine to cache other data ?
>
> - Rectangle and Rectangle2D are only used as the shape s and device
> rectangle given to CompositePipe.startSequence():
>     public Object startSequence(SunGraphics2D sg, Shape s, Rectangle dev,
> int[] abox);
>
> Changing this interface may become difficult:
> AlphaColorPipe.java:
>
>     41:  public Object startSequence(SunGraphics2D sg, Shape s, Rectangle dev,
> OK, [s, dev, abox] unused
>
> AlphaPaintPipe.java
>
>     81:  public Object startSequence(SunGraphics2D sg, Shape s, Rectangle 
> devR,
> create a paint context:
>         PaintContext paintContext =
>             sg.paint.createContext(sg.getDeviceColorModel(),
>                                    devR,
>                                    s.getBounds2D(),
>                                    sg.cloneTransform(),
>                                    sg.getRenderingHints());
>
> GeneralCompositePipe.java:
>
>     62:  public Object startSequence(SunGraphics2D sg, Shape s, Rectangle 
> devR,
> abox unused and create a paint context:
>         PaintContext paintContext =
>             sg.paint.createContext(model, devR, s.getBounds2D(),
>                                    sg.cloneTransform(),
>                                    hints);
>
> SpanClipRenderer.java
>
>     68:  public Object startSequence(SunGraphics2D sg, Shape s, Rectangle 
> devR,
> Forward to another composite pipe
> return new SCRcontext(ri, outpipe.startSequence(sg, s, devR, abox));
>
> It could be possible to use TileState into PaintContext interface / fix
> implementations but it may become a tricky change (API change).
>
> What do you think ?
>
> Laurent
>
>
> 2013/4/11 Jim Graham <james.gra...@oracle.com>
>
>> I'm pretty familiar with all of this code and there aren't any places
>> that save the tile array that I remember.  The embedded code that Pisces
>> was taken from had some caching of alpha arrays, but we didn't use or keep
>> that when we converted it for use in the JDK...
>>
>> It occurs to me that since you are collecting the various pieces of
>> information into an object to store in the thread local storage, perhaps we
>> should convert to a paradigm where an entire Tile Generation sequence uses
>> that object "TileState?" as its main way to communicate info around the
>> various stages.  Thus, you don't really need an int[4] to store the 4
>> parameters, they could be stored directly in the TileState object. This
>> would require more sweeping changes to the pipeline, but it might make the
>> code a bit more readable (and make the hits to convert over more moot as
>> they would be improving readability and give more focus to the
>> relationships between all of the various bits of data).  Then it simply
>> becomes a matter of managing the lifetime and allocation of the TileState
>> objects which is a minor update to the newly refactored code.
>>
>>                         ...jim
>>
>> On 4/10/13 3:59 PM, Sergey Bylokhov wrote:
>>
>>  On 4/10/13 11:46 PM, Laurent Bourgčs wrote:
>>>
>>>> I see that some methods which take it as argument doesn't use them. And
>>>>> most of the time we pass AATileGenerator and abox[] to the same
>>>>> methods, so
>>>>> it could be merged?
>>>>>
>>>>>  For now I did not want to modify the AAShapePipe signatures: abox[] is
>>>> filled by AATileGenerator implementations (ductus, pisces, others) in
>>>> order
>>>> to have the shape bounds and render only tiles covering this area.
>>>>
>>> You still have to check all the places, where these objects are filled
>>> and used, and refactoring is a good start, no?
>>> Otherwise, how can you prove that these arrays are used as you would
>>> expect, These arrays could be stored like the cache or re-used for other
>>> purpose(if someone don't want to create new arrays).
>>> Probably it will be good to split all your changes / to a few CR.
>>>   - cleanup
>>>   - Some small changes which gave us most speedup
>>>   - all other things.
>>> ??
>>>
>>>>
>>>>  Also I suggest to use jmh for java micrbenchmarks.
>>>>> http://openjdk.java.net/****projects/code-tools/jmh<http://openjdk.java.net/**projects/code-tools/jmh>
>>>>> <http:/**/openjdk.java.net/projects/**code-tools/jmh<http://openjdk.java.net/projects/code-tools/jmh>
>>>>> >
>>>>>
>>>>> So your test will be:
>>>>> http://cr.openjdk.java.net/~****serb/AAShapePipeBenchmark.java<http://cr.openjdk.java.net/%7E**serb/AAShapePipeBenchmark.java>
>>>>> **<http://cr.openjdk.java.net/%**7Eserb/AAShapePipeBenchmark.**java<http://cr.openjdk.java.net/%7Eserb/AAShapePipeBenchmark.java>
>>>>> >
>>>>>
>>>>>
>>>>>  Thanks,
>>>> I will try it asap
>>>>
>>>> Laurent
>>>>
>>>>
>>>>> --
>>>>> Best regards, Sergey.
>>>>>
>>>>>
>>>>>
>>>
>>>
>

Reply via email to