aboutsummaryrefslogtreecommitdiff
path: root/unsafe
diff options
context:
space:
mode:
authortedyu <yuzhihong@gmail.com>2015-05-07 16:53:59 -0700
committerJosh Rosen <joshrosen@databricks.com>2015-05-07 16:55:34 -0700
commit88063c62689135da56ee6678b2e826b88c382732 (patch)
tree5c49a6d221fb8416594e186eae1daa7348a54630 /unsafe
parent35f0173b8f67e2e506fc4575be6430cfb66e2238 (diff)
downloadspark-88063c62689135da56ee6678b2e826b88c382732.tar.gz
spark-88063c62689135da56ee6678b2e826b88c382732.tar.bz2
spark-88063c62689135da56ee6678b2e826b88c382732.zip
[SPARK-7450] Use UNSAFE.getLong() to speed up BitSetMethods#anySet()
Author: tedyu <yuzhihong@gmail.com> Closes #5897 from tedyu/master and squashes the following commits: 473bf9d [tedyu] Address Josh's review comments 1719c5b [tedyu] Correct upper bound in for loop b51dcaf [tedyu] Add unit test in BitSetSuite for BitSet#anySet() 83f9f87 [tedyu] Merge branch 'master' of github.com:apache/spark 817e3f9 [tedyu] Replace constant 8 with SIZE_OF_LONG 75a467b [tedyu] Correct offset for UNSAFE.getLong() 855374b [tedyu] Remove second loop since bitSetWidthInBytes is WORD aligned 093b7a4 [tedyu] Use UNSAFE.getLong() to speed up BitSetMethods#anySet() 63ee050 [tedyu] Use UNSAFE.getLong() to speed up BitSetMethods#anySet() 4ca0ef6 [tedyu] Use UNSAFE.getLong() to speed up BitSetMethods#anySet() 3e9b6919 [tedyu] Use UNSAFE.getLong() to speed up BitSetMethods#anySet()
Diffstat (limited to 'unsafe')
-rw-r--r--unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSet.java8
-rw-r--r--unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSetMethods.java7
-rw-r--r--unsafe/src/test/java/org/apache/spark/unsafe/bitset/BitSetSuite.java7
3 files changed, 19 insertions, 3 deletions
diff --git a/unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSet.java b/unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSet.java
index f72e07fce9..28e23da108 100644
--- a/unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSet.java
+++ b/unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSet.java
@@ -102,4 +102,12 @@ public final class BitSet {
public int nextSetBit(int fromIndex) {
return BitSetMethods.nextSetBit(baseObject, baseOffset, fromIndex, numWords);
}
+
+ /**
+ * Returns {@code true} if any bit is set.
+ */
+ public boolean anySet() {
+ return BitSetMethods.anySet(baseObject, baseOffset, numWords);
+ }
+
}
diff --git a/unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSetMethods.java b/unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSetMethods.java
index f30626d8f4..0987191c1c 100644
--- a/unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSetMethods.java
+++ b/unsafe/src/main/java/org/apache/spark/unsafe/bitset/BitSetMethods.java
@@ -70,9 +70,10 @@ public final class BitSetMethods {
/**
* Returns {@code true} if any bit is set.
*/
- public static boolean anySet(Object baseObject, long baseOffset, long bitSetWidthInBytes) {
- for (int i = 0; i <= bitSetWidthInBytes; i++) {
- if (PlatformDependent.UNSAFE.getByte(baseObject, baseOffset + i) != 0) {
+ public static boolean anySet(Object baseObject, long baseOffset, long bitSetWidthInWords) {
+ long addr = baseOffset;
+ for (int i = 0; i < bitSetWidthInWords; i++, addr += WORD_SIZE) {
+ if (PlatformDependent.UNSAFE.getLong(baseObject, addr) != 0) {
return true;
}
}
diff --git a/unsafe/src/test/java/org/apache/spark/unsafe/bitset/BitSetSuite.java b/unsafe/src/test/java/org/apache/spark/unsafe/bitset/BitSetSuite.java
index e3a824e29b..18393db9f3 100644
--- a/unsafe/src/test/java/org/apache/spark/unsafe/bitset/BitSetSuite.java
+++ b/unsafe/src/test/java/org/apache/spark/unsafe/bitset/BitSetSuite.java
@@ -39,6 +39,8 @@ public class BitSetSuite {
for (int i = 0; i < bs.capacity(); i++) {
Assert.assertFalse(bs.isSet(i));
}
+ // another form of asserting that the bit set is empty
+ Assert.assertFalse(bs.anySet());
// Set every bit and check it.
for (int i = 0; i < bs.capacity(); i++) {
@@ -52,6 +54,11 @@ public class BitSetSuite {
bs.unset(i);
Assert.assertFalse(bs.isSet(i));
}
+
+ // Make sure anySet() can detect any set bit
+ bs = createBitSet(256);
+ bs.set(64);
+ Assert.assertTrue(bs.anySet());
}
@Test