On Tue, 19 Jan 2021 21:40:24 GMT, Paul Sandoz <psan...@openjdk.org> wrote:

>> Hi all,
>> 
>> For this reproducer:
>> 
>> import jdk.incubator.vector.ByteVector;
>> import jdk.incubator.vector.VectorSpecies;
>> 
>> public class Test {
>>     static final VectorSpecies<Byte> SPECIES_128 = ByteVector.SPECIES_128;
>>     static byte[] a = new byte[8];
>>     static byte[] b = new byte[8];
>> 
>>     public static void main(String[] args) {
>>         ByteVector av = ByteVector.fromArray(SPECIES_128, a, 0);
>>         av.intoArray(b, 0);
>>         System.out.println("b: " + b[0]);
>>     }
>> }
>> 
>> The following IndexOutOfBoundsException message (length -7) is unreasonable.
>> 
>> Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out 
>> of bounds for length -7
>> 
>> It might be better to fix it like this.
>> 
>> Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out 
>> of bounds for length 0
>> 
>> Thanks.
>> Best regards,
>> Jie
>
> That change may cause performance issues. I would recommend leaving as is for 
> now even through the error message is not great. Bounds checking is quite 
> sensitive and WIP. Notice that we also have an option to call 
> `Objects.checkFromIndexSize` which expresses the intent more accurately, but 
> that is currently less optimal (at least it was when i last checked since it 
> is non an intrinsic).

Thanks @PaulSandoz for your review and comments.

Updated:
 - The performance issue has been fixed since there is no more operation for 
common cases.
 - The readability of OOB exception msg has been improved by following the 
style of Objects.checkFromIndexSize.
 - Less code generated (several blocks of code were optimized out for the 
Test::test method below).

import jdk.incubator.vector.ByteVector;
import jdk.incubator.vector.VectorSpecies;

public class Test {
    static final VectorSpecies<Byte> SPECIES_128 = ByteVector.SPECIES_128;
    static byte[] a = new byte[88];
    static byte[] b = new byte[88];

    public static void test() {
        ByteVector av = ByteVector.fromArray(SPECIES_128, a, 0);
        av.intoArray(b, 0);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100000; i++) {
            test();
        }
        System.out.println("b: " + b[0]);
    }
}

What do you think of it?
Thanks.

-------------

PR: https://git.openjdk.java.net/jdk/pull/2127

Reply via email to