Просто возьмите следующий код и посмотрите, достаточно ли он быстр.
package so3883485;
import java.util.concurrent.atomic.AtomicLong;
public class ByteArrayUtils {
static final AtomicLong COMPARE_COUNT = new AtomicLong(0);
public static int compare(byte[] b1, int b1Index, int b1Length, byte[] b2, int b2Index, int b2Length) {
COMPARE_COUNT.incrementAndGet();
final int commonLength = Math.min(b1Length, b2Length);
for (int i = 0; i < commonLength; i++) {
final byte byte1 = b1[b1Index + i];
final byte byte2 = b2[b2Index + i];
if (byte1 != byte2) {
return (byte1 < byte2) ? -1 : 1;
}
}
if (b1Length != b2Length) {
return (b1Length < b2Length) ? -2 : 2;
}
return 0;
}
}
И какой-нибудь модульный тест, чтобы убедиться, что базовые случаи работают как положено.
package so3883485;
import static org.junit.Assert.*;
import static so3883485.ByteArrayUtils.*;
import org.junit.Test;
public class ByteArrayUtilsTest {
@Test
public void test() {
byte[] bytes = { 1, 2, 3, 4, 5 };
assertEquals(0, compare(bytes, 0, bytes.length, bytes, 0, bytes.length));
assertEquals(0, compare(bytes, 0, 0, bytes, 0, 0));
assertEquals(-2, compare(bytes, 0, 0, bytes, 0, 1));
assertEquals(2, compare(bytes, 0, 1, bytes, 0, 0));
assertEquals(-1, compare(bytes, 1, 1, bytes, 2, 1));
assertEquals(1, compare(bytes, 2, 1, bytes, 1, 1));
}
}