Hi Laurent,

These are great results! And they are much easier to read with the tables (which seem to get lost in my reply, oops!).

If it is just the dashing results I can believe that as Ductus does a pretty good job of minimizing the number of segments in its stroked output paths. The losses are pretty small in that case so we are getting pretty close to being able to deprecate Ductus at some point which would be awesome (still a bit of reliability testing "in the wild" before we can actually switch full time, though)...

                        ...jim

On 10/12/15 12:44 PM, Laurent Bourgès wrote:
Hi Jim,

Here is below the webrev I prepared last saturday night.

However, I made progress since as I inlined few methods and now use
Unsafe for rowAAChunk storage (to save few percents avoiding bound checks).
*So please, just have a look to see the new hybrid approach but do not
make a full review !
*
I will try sending another patch 4.2 asap...


Webrev 4.1:
http://cr.openjdk.java.net/~lbourges/marlin/marlin-s4.1/

1. I simplified the previous patch to have only 2 variants (raw or RLE
with blockFlags) but as an hybrid approach as each pixel row can use
either encoding=raw or encoding=rle depending on its complexity
(heuristics).

2. I fixed fore-mentioned bugs related to crossing array resizing
(ptrEnd) but also added a simple overflow check to the edge array:
indices (pointer like in edgeBuckets and edge.next) are only integer so
it only works if edges array is smaller than 2Gb.

It works very well on both jdk8 and openjdk9:

Marlin 0.7.1 OpenJDK9(with Sergey gcc hack):
Test    Threads         Ops     Med     Pct95   Avg     StdDev  Min     Max     
TotalOps
CircleTests.ser         1       162     64.827  65.118  64.855  0.123   64.597  
65.474  162
*EllipseTests-fill-false.ser *  *1*     *36*    *289.896*       *290.251*
*289.941*       *0.157*         *289.759*       *290.487*       *36*
*EllipseTests-fill-true.ser *   *1*     *25*    *442.567*       *442.784*
*442.601*       *0.197*         *442.373*       *443.356*       *25*
dc_boulder_2013-13-30-06-13-17.ser      1       116     90.328  90.849  90.371
0.278   89.904  91.448  116
dc_boulder_2013-13-30-06-13-20.ser      1       222     46.882  47.23   46.897
0.197   46.377  47.689  222
dc_shp_alllayers_2013-00-30-07-00-43.ser        1       268     39.101  39.307
39.116  0.121   38.913  40.088  268
dc_shp_alllayers_2013-00-30-07-00-47.ser        1       25      772.936         
774.375
773.059         0.736   771.858         774.596         25
dc_spearfish_2013-11-30-06-11-15.ser    1       823     12.676  12.807  12.705
0.076   12.653  13.285  823
dc_spearfish_2013-11-30-06-11-19.ser    1       1640    6.401   6.467   6.41
0.036   6.385   6.74    1640
dc_topp:states_2013-11-30-06-11-06.ser  1       853     12.299  12.382  12.314
0.033   12.278  12.453  853
dc_topp:states_2013-11-30-06-11-07.ser  1       1402    7.502   7.57    7.507
0.038   7.445   7.755   1402
test_z_625k.ser         1       68      152.561         153.037         152.582 
        0.261   152.179
153.549         68


Ductus JDK8:
Test    Threads         Ops     Med     Pct95   Avg     StdDev  Min     Max     
TotalOps
CircleTests.ser         1       148     69.971  71.418  70.068  0.719   68.369  
72.031  148
*EllipseTests-fill-false.ser *  *1*     *35*    *297.56*        *299.328*
*297.48*        *1.093*         *295.417*       *299.59*        *35*
*EllipseTests-fill-true.ser *   *1*     *25*    *453.612*       *456.29*
*453.589*       *1.813*         *448.936*       *456.817*       *25*
dc_boulder_2013-13-30-06-13-17.ser      1       93      112.865         113.419 
        112.88
0.277   112.377         113.459         93
dc_boulder_2013-13-30-06-13-20.ser      1       183     56.944  57.521  56.987
0.26    56.528  58.187  183
dc_shp_alllayers_2013-00-30-07-00-43.ser        1       220     47.955  48.555
47.975  0.346   47.223  49.203  220
dc_shp_alllayers_2013-00-30-07-00-47.ser        1       25      1056.025        
1058.306
1056.215        1.079   1054.813        1058.515        25
dc_spearfish_2013-11-30-06-11-15.ser    1       628     16.798  17.095  16.837
0.125   16.633  17.343  628
dc_spearfish_2013-11-30-06-11-19.ser    1       1354    7.605   7.896   7.663
0.104   7.553   8.217   1354
dc_topp:states_2013-11-30-06-11-06.ser  1       616     16.988  17.097  16.98
0.086   16.737  17.513  616
dc_topp:states_2013-11-30-06-11-07.ser  1       931     11.319  11.397  11.304
0.066   11.052  11.479  931
test_z_625k.ser         1       50      208.874         209.563         208.85  
0.439   206.91  209.9   50


I tested the new patch with J2DBench (having my warmup patch) using my
default profile (size=1 to 1000, stokes=1,5, dash=off/on) in
single-threaded tests:
- pisces vs marlin:
http://cr.openjdk.java.net/~lbourges/marlin/j2dBench_reports/html_pisces_marlin_071/Testcase_Summary_Report.html
- ductus vs marlin:
http://cr.openjdk.java.net/~lbourges/marlin/j2dBench_reports/html_ductus_marlin_071/Testcase_Summary_Report.html

Marlin is always largely faster than pisces and a bit faster than
ductus, except for some tests with dash1_5 as you can see in the
complete report:
http://cr.openjdk.java.net/~lbourges/marlin/j2dBench_reports/html_ductus_marlin_071/J2DBench_Complete_Report.html

Finally it is very promising and worth the effort I made during last weeks.

    One thing that occurred to me is that the 2 strategies - RLE vs
    uncompressed - might be easier to follow and manage if they were
    broken out into separate classes:

    MarlinCache
    +--- MarlinRLECache
    +--- MarlinUncompressedCache


It was a good idea but I finally adopted an hybrid approach (sharing the
same data storage): the same shape can use both strategies (mixed, not
exclusive anymore).

Cheers,
Laurent

Reply via email to