I know java.lang.StringCoding.hasNegatives has a HotSpotIntrinsicCandidate annotation/implementation, but is there interest/value in a faster pure java implementation?
Using Unsafe to read and compare 8 bytes at a time as a long is faster than the current simple implementation both in interpreter only mode and default hotspot compiler mode. I can provide jmh bencmark and results if this is worthwhile to pursue. Thanks, Brett private static final long NEGATIVE_MASK = 0x8080808080808080L; public static boolean hasNegatives(byte[] ba, int off, int len) { int i = off; final int endIdx = off + len; // align to 8 byte reads while ((i & 7) != 0 && i < endIdx) { if (ba[i++] < 0) { return true; } } // read 8 bytes at a time as a long (platform endian-ness does not matter) // to check if any have negative bit set final Unsafe unsafe = Unsafe.getUnsafe(); for (int j = endIdx - 7; i < j; i += 8) { final long val = unsafe.getLong(ba, Unsafe.ARRAY_BYTE_BASE_OFFSET + i); if ((val & NEGATIVE_MASK) != 0) { return true; } } // process trailing bytes 1 by 1 for ( ; i < endIdx; i++) { if (ba[i] < 0) { return true; } } return false; }