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;
     }