[11] RFR 8193085 Vectorize the nio Buffer equals and compareTo implementations
Paul Sandoz
paul.sandoz at oracle.com
Mon Dec 18 20:55:51 UTC 2017
> On 18 Dec 2017, at 06:07, Alan Bateman <Alan.Bateman at oracle.com> wrote:
>
> On 15/12/2017 20:29, Paul Sandoz wrote:
>> Hi,
>>
>> Please review this patch to vectorize the buffer equals and compareTo implementations, using the same approach that was used for arrays:
>>
>> http://cr.openjdk.java.net/~psandoz/jdk/JDK-8193085-buffer-equals-compareTo-vectorize/webrev/ <http://cr.openjdk.java.net/~psandoz/jdk/JDK-8193085-buffer-equals-compareTo-vectorize/webrev/>
>>
>> This patch expands on using the double address mode of unsafe to uniformly access a memory region covered by a buffer be it on or off heap. Only buffers with the same endianness can support optimized equality and comparison.
> I've looked through the changes and it looks quite good.
>
> It might be useful to add a comment in StringCharBuffer to explain why equals/compareTo are overridden.
See below.
> Also it might be safer if the mismatch method that takes CharBuffers checks if one of charRegionOrders is null to guarantee that it will never do a vectorizedMismatch test with a wrapped char sequence (it would catch a serious bug if someone were to misuse to call it with two StringCharBuffers).
There is already an assert, perhaps i can simplify this:
1) StringCharBuffer does not require special overrides.
2) Update the mismatch method:
static int mismatch(CharBuffer a, int aOff, CharBuffer b, int bOff, int length) {
int i = 0;
// Ensure only heap or off-heap buffer instances use the
// vectorized mismatch. If either buffer is a StringCharBuffer
// (order is null) then the slow path is taken
if (length > 3 && a.charRegionOrder() == b.charRegionOrder()
&& a.charRegionOrder() != null && b.charRegionOrder() != null) {
I updated the webrev in place (i also updated the test to test big vs. little endian).
> Not for this patch but XXXBuffer.compareTo doesn't specify how it compares when the remaining elements in one buffer is a proper prefix of the remaining elements in the other buffer.
>
Right. There is a follow on bug to add new API points and we can do a cleanup as part of that.
> It's hard to see the changes to ArraySupport. I assume it's just the package name and changing the methods to public. I can't tell why webrev doesn't handle the move in this case.
I dunno why that was not tracked. It’s just changes to the package name and method accessibility.
> Another one is Arrays where they are some re-formatting in the patch that webrev doesn't show (I can't tell if this is intended or not).
>
That was a refactoring glitch, fixed:
http://cr.openjdk.java.net/~psandoz/jdk/JDK-8193085-buffer-equals-compareTo-vectorize/webrev/src/java.base/share/classes/java/util/Arrays.java.sdiff.html
> It would be good if the really long lines in BufferMismatch could be trimmed down (maybe import static ArraySupport) as it will very annoying to do side-by-side diffs when reviewing future changes.
Done.
> There are several places where the styles differs to the style in this area but it's probably not worth spending time on.
>
Agreed, the only sane way to do this is to have auto-formatting on commit (i have it set up in my IDE but it’s obviously not consistent will all source code). And it requires a benevolent dictator with good taste to state the format, since i suspect we will never reach consensus on such matters :-)
> The test looks okay although it overlaps with the existing tests.
>
Yes, although the existing Buffer equals/compareTo tests are somewhat limited (especially regarding length). These new tests will also help if/when a public mismatch method is added.
Thanks,
Paul.
More information about the core-libs-dev
mailing list