Author: slebresne Date: Mon Nov 14 14:31:42 2011 New Revision: 1201726 URL: http://svn.apache.org/viewvc?rev=1201726&view=rev Log: Use (Guava inspired) faster bytes comparison patch by slebresne; reviewed by jbellis for CASSANDRA-3434
Modified: cassandra/trunk/CHANGES.txt cassandra/trunk/src/java/org/apache/cassandra/utils/ByteBufferUtil.java cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java cassandra/trunk/test/unit/org/apache/cassandra/db/marshal/ReversedTypeTest.java cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1201726&r1=1201725&r2=1201726&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Mon Nov 14 14:31:42 2011 @@ -5,6 +5,7 @@ * replace compactionlock use in schema migration by checking CFS.isValid (CASSANDRA-3116) * recognize that "SELECT first ... *" isn't really "SELECT *" (CASSANDRA-3445) + * Use faster bytes comparison (CASSANDRA-3434) 1.0.3 Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/ByteBufferUtil.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/ByteBufferUtil.java?rev=1201726&r1=1201725&r2=1201726&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/utils/ByteBufferUtil.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/utils/ByteBufferUtil.java Mon Nov 14 14:31:42 2011 @@ -80,23 +80,25 @@ public class ByteBufferUtil { assert o1 != null; assert o2 != null; + if (o1 == o2) + return 0; if (o1.hasArray() && o2.hasArray()) { return FBUtilities.compareUnsigned(o1.array(), o2.array(), o1.position() + o1.arrayOffset(), o2.position() + o2.arrayOffset(), o1.remaining(), o2.remaining()); } - - int minLength = Math.min(o1.remaining(), o2.remaining()); - for (int x = 0, i = o1.position(), j = o2.position(); x < minLength; x++, i++, j++) - { - if (o1.get(i) == o2.get(j)) - continue; - // compare non-equal bytes as unsigned - return (o1.get(i) & 0xFF) < (o2.get(j) & 0xFF) ? -1 : 1; - } - return (o1.remaining() == o2.remaining()) ? 0 : ((o1.remaining() < o2.remaining()) ? -1 : 1); + int end1 = o1.position() + o1.remaining(); + int end2 = o2.position() + o2.remaining(); + for (int i = o1.position(), j = o2.position(); i < end1 && j < end2; i++, j++) + { + int a = (o1.get(i) & 0xff); + int b = (o2.get(j) & 0xff); + if (a != b) + return a - b; + } + return o1.remaining() - o2.remaining(); } public static int compare(byte[] o1, ByteBuffer o2) Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=1201726&r1=1201725&r2=1201726&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java Mon Nov 14 14:31:42 2011 @@ -288,22 +288,7 @@ public class FBUtilities public static int compareUnsigned(byte[] bytes1, byte[] bytes2, int offset1, int offset2, int len1, int len2) { - if (bytes1 == null) - { - return bytes2 == null ? 0 : -1; - } - if (bytes2 == null) return 1; - - int minLength = Math.min(len1, len2); - for (int x = 0, i = offset1, j = offset2; x < minLength; x++, i++, j++) - { - if (bytes1[i] == bytes2[j]) - continue; - // compare non-equal bytes as unsigned - return (bytes1[i] & 0xFF) < (bytes2[j] & 0xFF) ? -1 : 1; - } - if (len1 == len2) return 0; - else return (len1 < len2) ? -1 : 1; + return FastByteComparisons.compareTo(bytes1, offset1, len1, bytes2, offset2, len2); } /** Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/marshal/ReversedTypeTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/marshal/ReversedTypeTest.java?rev=1201726&r1=1201725&r2=1201726&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/db/marshal/ReversedTypeTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/db/marshal/ReversedTypeTest.java Mon Nov 14 14:31:42 2011 @@ -30,11 +30,11 @@ public class ReversedTypeTest { ReversedType<Long> t = ReversedType.getInstance(LongType.instance); - assert t.compare(bytes(2L), bytes(4L)) == 1; - assert t.compare(bytes(4L), bytes(2L)) == -1; + assert t.compare(bytes(2L), bytes(4L)) > 0; + assert t.compare(bytes(4L), bytes(2L)) < 0; // the empty byte buffer is always the smaller - assert t.compare(EMPTY_BYTE_BUFFER, bytes(2L)) == -1; - assert t.compare(bytes(2L), EMPTY_BYTE_BUFFER) == 1; + assert t.compare(EMPTY_BYTE_BUFFER, bytes(2L)) < 0; + assert t.compare(bytes(2L), EMPTY_BYTE_BUFFER) > 0; } } Modified: cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java?rev=1201726&r1=1201725&r2=1201726&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java Mon Nov 14 14:31:42 2011 @@ -308,8 +308,8 @@ public class RangeTest Token t4 = new BytesToken(new byte[] { 1,2,3 }); Token t5 = new BytesToken(new byte[] { 4,5,6,7 }); - assert Range.compare(t4, t5) == -1; - assert Range.compare(t5, t4) == 1; + assert Range.compare(t4, t5) < 0; + assert Range.compare(t5, t4) > 0; assert Range.compare(t1, t4) == 0; }