You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2011/11/14 15:31:43 UTC
svn commit: r1201726 - in /cassandra/trunk: ./
src/java/org/apache/cassandra/utils/
test/unit/org/apache/cassandra/db/marshal/
test/unit/org/apache/cassandra/dht/
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;
}