Good point, looks like I was overly concerned about the null check and
inlining of that method. I had to manually inline the slicing-by-8 loop
to guarantee good performance.
Removed the ENDIAN field and use ByteOrder.nativeOrder() directly instead.
New webrev - http://cr.openjdk.java.net/~sfriberg/JDK-6321472/webrev.02
Thanks,
Staffan
On 10/17/2014 12:51 PM, Vitaly Davidovich wrote:
I wouldn't even bother with ENDIAN field; ByteOrder.nativeOrder(),
which calls Bits.byteOrder(), which returns a static final field
(modulo a null check) should get JIT compiled into just a read of
Bits.byteOrder. If storing ByteOrder.nativeOrder() in a static final
field actually makes a difference vs using ByteOrder.nativeOrder() in
JIT compiled code, I'd be pretty sad :).
On Fri, Oct 17, 2014 at 3:45 PM, Stanimir Simeonoff
<stani...@riflexo.com <mailto:stani...@riflexo.com>> wrote:
Hi,
I don't quite see the point of this line:
private transient final static ByteOrder ENDIAN
= ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN)
? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
should be just private static final ByteOrder ENDIAN =
ByteOrder.nativeOrder();
Also you don't need equals for enums alikes, just reference
comparison (==)
as they are constants.
Alternatively you can just replace it with a boolean as there are
no more
endianess options.
Stanimir
On Fri, Oct 17, 2014 at 9:58 PM, Staffan Friberg
<staffan.frib...@oracle.com <mailto:staffan.frib...@oracle.com>
> wrote:
> On 10/17/2014 04:05 AM, Alan Bateman wrote:
>
>> On 17/10/2014 02:42, Staffan Friberg wrote:
>>
>>> Hi,
>>>
>>> This RFE adds a CRC-32C class. It implements Checksum so it
will have
>>> the same API CRC-32, but use a different polynomial when
calculating the
>>> CRC checksum.
>>>
>>> CRC-32C implementation uses slicing-by-8 to achieve high
performance
>>> when calculating the CRC value.
>>>
>>> A part from adding the new class, java.util.zip.CRC32C, I have
also
>>> added two default methods to Checksum. These are methods that
were added to
>>> Adler32 and CRC32 in JDK 8 but before default methods were
added, which was
>>> why they were only added to the implementors and not the
interface.
>>>
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-6321472
>>> Webrev:
http://cr.openjdk.java.net/~sfriberg/JDK-6321472/webrev.00
<http://cr.openjdk.java.net/%7Esfriberg/JDK-6321472/webrev.00>
>>>
>>> I looked over the javadoc, I haven't found time to study the
>> implementation in CRC32C closely yet. Hopefully Sherman will be
able to
>> review as he I think he has prototyped several CRC32C
implementations.
>>
>> On Checksum#update(ByteBuffer) then a suggestion for:
>> "The checksum is updated using buffer.remaining, starting a
>> buffer.position"
>> is to replace it with:
>> "The checksum is updated with the remaining bytes in the buffer,
>> starting at the buffer's position."
>>
>
> Yes that reads much better. Updated CRC32 and Adler32 as well
since they
> have the same text.
>
>
>> In the @implNote then I wonder if it would be better to just
leave out
>> the note about when the invariants are broken, we don't do that
in other
>> places where breakage this is detected. Also I wonder if the
note about
>> "For best performance, ..." should be an @apiNote.
>>
> Done, removed the assert comment and changed the performance
note to an
> @apiNote.
>
>
>> Should CRC32C be final unless we have a good reason for it not
to be
>> final?
>>
> I simply followed what was used for CRC32 and Adler32, but I
don't see a
> reason for not making it final. Guess it is too late to make
those two
> classes final though?
>
>
>> In CRC32C then I assume you don't need the <p>/<p> for the first
>> statement. The @see Checksum might not be too interesting here
given that
>> it will be linked to anyway by way of implement Checksum.
>>
>
> Removed @see in all three classes.
>
>
>> I think it's more usual to list the @param tags before the @throws.
>>
> I removed that @param tags as they are already described in the
Checksum
> interface and will be picked up from there by Javadoc. Will do
the same in
> CRC32 and Adler32 as well.
>
>
>> For the bounds check then you might want to look at the wording
in other
>> areas (in java.lang or java.io <http://java.io> for example) to
get this better wording
>> (as off+len can overflow).
>>
> Done, I update CRC32 and Adler32 as well to make keep them as
similar as
> possible.
>
>
>> A minor comment on CRC32C is that you might want to keep the
line lengths
>> consistent with the rest of the code. I only mention is for future
>> side-by-side reviews to make it a bit easier and avoid too much
horizontal
>> scrolling.
>>
> Done, lines are now <80 or very close in a few cases where
breaking them
> made the code harder to read.
>
>>
>> -Alan
>>
>
> Here is a new webrev with the updates from Alan's and Peter's
suggestions.
> http://cr.openjdk.java.net/~sfriberg/JDK-6321472/webrev.01
<http://cr.openjdk.java.net/%7Esfriberg/JDK-6321472/webrev.01>
>
> Thanks,
> Staffan
>
>