[OpenJDK 2D-Dev] [OpenJDK Rasterizer] Path2d needRoom very slow for huge paths

Jim Graham james.graham at oracle.com
Wed Apr 8 20:53:30 UTC 2015


Hi Laurent,

I'd probably do:

int newsizemin = oldcount + newitems;
if (newsizemin < oldcount) {
     // hard overflow failure - we can't even accommodate
     // new items without overflowing
     return failure, throw exception?
}
int newsize = <growth algorithm computation>;
if (newsize < newsizemin) {
     // overflow in growth algorithm computation
     newsize = newsizemin;
     ... OR ...
     newsize = MAX_INT;
}
while (true) {
     try {
         allocate newsize;
         break;  (or return?)
     } catch (OOME e) {
         if (newsize == newsizemin) {
             throw e;
         }
     }
     newsize = newsizemin + (newsize - newsizemin) / 2;
}

			...jim

On 4/8/15 9:34 AM, Laurent Bourgès wrote:
> Jim,
>
> let's go back to concrete code:
>
> 2015-04-04 0:25 GMT+02:00 Jim Graham <james.graham at oracle.com
> <mailto:james.graham at oracle.com>>:
>
>     The patch as it is will make things much better, but it may be worth
>     "doing it right" as long as we are revisiting this algorithm and
>     write it to deal better with the OOME/integer overflow cases.
>
>
> My patch is very simple and a lot better for huge paths.
> It is not perfect as it does not handle integer overflow (impossible
> case for me) nor OOME.
>
> How could I handle OOME first ? any advice ?
>
> I could try allocating a smaller array in case of OOME ? any example in
> JDK ?
>
>     I looked at the ArrayList code and found a bit of voodoo there in
>     the overflow code which troubled me as a potential maintainer.  It's
>     one thing to write clever code, it's another thing to write clever
>     code that others can come along and maintain without having to fill
>     a white board with input/output ranges and 2's complement rules.
>     It's not like this code is going to be in an inner loop somewhere -
>     the time for a couple of conditional checks and min/maxes will be
>     vastly swallowed by the costs of allocation and copying data so it
>     would be better to just write straightforward code whose overflow
>     considerations are documented for future maintainers.  (Having said
>     that I probably wrote some pretty obtusely clever code in the
>     Rectangle class myself... D'oh!)  My general goal is to include
>     comments with the incoming assumptions and then document how I've
>     ruled out cases and narrowed ranges with small single-line comments
>     as the calculations and decisions are made...
>
>
> Please give me hints, so I could improve the proposed webrev.
>
> Laurent



More information about the 2d-dev mailing list