[OpenJDK Rasterizer] Fwd: Re: Fwd: RFR: Marlin renderer #3
Laurent Bourgès
bourges.laurent at gmail.com
Mon Aug 17 21:34:24 UTC 2015
Jim & Phil
Here is a new webrev:
http://cr.openjdk.java.net/~lbourges/marlin/marlin-s3.4/
Changes:
- Renderer: remove unused D_ERR_STEP_MAX and 0x1 replaced by 1 for
readability
- MarlinRenderingEngine: optimized loop in pathTo()
- Dasher: TODO remains related to dash length issue
Hope it is good now, I plan to work soon on the Array Cache & dispose code.
Here are my comments to your emails:
1st email:
2015-08-13 22:32 GMT+02:00 Jim Graham <james.graham at oracle.com>:
>
> On 8/10/2015 2:15 PM, Laurent Bourgès wrote:
>
>> Jim,
>>
>> Here is the new webrev including your proposals to use 32.31 fixed-point
>> maths and double-precision in addLine() as it is definitely better:
>> http://cr.openjdk.java.net/~lbourges/marlin/marlin-s3.3/
>>
>
> Why are ceil_int and floor_int implemented differently?
>
Fixed and tested OK.
>
> For CHECK_NAN, how fast is Math.isNaN? Is it worth first comparing the
> intpart to the value that NaN converts to before calling isNaN? The
> majority case, by a wide margin, is that the value is not NaN.
>
That's the aim: I test first the most probable case (a <= intpart) for
ceil() and then check possible overflow and finally check for NaN values to
avoid adding / substracting 1 !
I made benchmarks and this implementation optimized for the integer domain
works very well: 2x faster.
>
> Helpers.java, line 214 - why move the declaration into the for loop? That
> is confusing to me since "j" is not used in the for() conditions.
>
Reverted, sorry.
> MarlinConst - It looks like the subpixel sizes are now properties. Did
> that have performance consequences? The values are no longer true literal
> constants when compiling the code now.
>
In Marlin, several constant values are customizable by system properties
for some time ! However, hotspot considers them as "proper" constants and
performs its optimizations at runtime to final static fields => inlined as
fast as true literals.
2nd email:
> 2015-08-13 22:35 GMT+02:00 Jim Graham <james.graham at oracle.com>:
>
> On 8/10/2015 2:15 PM, Laurent Bourgès wrote:
>
>> Renderer.java, line 792: Do you need to copy ERR_STEP_MAX into a
>> local? It is a statically initialized final int - that should
>> already be a constant that gets copied into the code.
>>
>>
>> I always copy constants used in loops to avoid repeated constant lookups.
>>
>
> I was under the understanding that if a constant is declared final and
> static, then it is compiled directly into the code and there is no constant
> lookup. Check the bytecodes and you should see a hard-coded literal
> 0x7fffffff everywhere it is used...
>
I agree but it seems slightly faster: probably loading the literal is a bit
slower than loading from the stack ?
Maybe some hotspot experts could give their opinion.
As this is the renderer hot loop, I prefer making it as fast as possible.
3rd email:
2015-08-13 22:45 GMT+02:00 Jim Graham <james.graham at oracle.com>:
> Is multiplying by POWER_2_TO_32 really faster than scalb? Quick power of
> 2 multiplies was supposed to be what scalb was good at, but if they didn't
> make it a Hotspot intrinsic then it may not work as well...
>
I do not know if there is an intrinsic implementation but it is 2x faster
in my microbenchmarks. I looked at Math.scalb() implementation and it has
several conditional checks (huge exponents handled in while loop) and it
computes 2^n at every call:
that's why I precompute the correct scaling factor once !
>
> Renderer.java, line 807 - missing space before =
>
Fixed.
4th email:
2015-08-13 22:56 GMT+02:00 Jim Graham <james.graham at oracle.com>:
> What is with the new added "default" cases? Do they help the compiler?
>
It just fixes several Findbugs warnings without any side-effect.
> I'll defer to Phil on the naming of the new system properties
> (sun.java2d.renderer.*). Eventually Marlin may replace both Pisces and
> Ductus and then the generic names make sense. Should they have "marlin" in
> the name until then?
>
This is not new and present in the first Marlin patch.
However, these properties are helpful to tune Marlin settings (performance
and quality).
I could remove some properties in the future once Marlin will be tested
enough and its tuning done.
Phil's email:
2015-08-13 23:20 GMT+02:00 Phil Race <philip.race at oracle.com>:
> On 08/13/2015 01:56 PM, Jim Graham wrote:
>
>> What is with the new added "default" cases? Do they help the compiler?
>>
>> I'll defer to Phil on the naming of the new system properties
>> (sun.java2d.renderer.*). Eventually Marlin may replace both Pisces and
>> Ductus and then the generic names make sense. Should they have "marlin" in
>> the name until then?
>>
>
> I think that at least for now they should either be
> sun.java2d.renderer.marlin.* or
> just sun.java2d.marlin.*
>
Ok, I can rename them in the next webrev as it requires me to upgrade all
my testing & benchmarking scripts...
> But the more important question may be around how much benefit these
> bring compared to the additional testing overhead of so many combinations ?
>
I advocate it is not easy to test all combinations but it seems not a
reasonable testing objective.
As I said, it is mainly tuning or quality settings but only few are
important (subpixels X / Y, tile size, initial pixel size).
Jim, thanks for all your efforts & take care,
Best regards,
Laurent
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/graphics-rasterizer-dev/attachments/20150817/1cd2c939/attachment.html>
More information about the graphics-rasterizer-dev
mailing list