Skip to content

Commit 2786fbb

Browse files
Optimized check for value presence in run container (#705)
* optimized run container's contains() with bitmap * optimized mappable run container's contains() with bitmap * test + benchmark for contains() * benchmark correction * benchmark correction * checkstyle * removed comparison for optimized contains() of (Mappeable)RunContainer
1 parent a81f12c commit 2786fbb

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

RoaringBitmap/src/main/java/org/roaringbitmap/RunContainer.java

+16-5
Original file line numberDiff line numberDiff line change
@@ -817,19 +817,30 @@ protected boolean contains(BitmapContainer bitmapContainer) {
817817
}
818818
final int runCount = numberOfRuns();
819819
char ib = 0, ir = 0;
820+
int start = getValue(ir);
821+
int stop = start + getLength(ir);
820822
while(ib < bitmapContainer.bitmap.length && ir < runCount) {
821823
long w = bitmapContainer.bitmap[ib];
822-
while (w != 0 && ir < runCount) {
823-
int start = (getValue(ir));
824-
int stop = start+ (getLength(ir));
825-
long t = w & -w;
824+
while (true) {
826825
long r = ib * 64L + Long.numberOfTrailingZeros(w);
827826
if (r < start) {
828827
return false;
829828
} else if(r > stop) {
830829
++ir;
830+
if (ir == runCount) {
831+
break;
832+
}
833+
w &= w - 1;
834+
start = getValue(ir);
835+
stop = start + getLength(ir);
836+
} else if (ib * 64 + 64 < stop) {
837+
ib = (char) (stop / 64);
838+
w = bitmapContainer.bitmap[ib];
831839
} else {
832-
w ^= t;
840+
w &= w - 1;
841+
if (w == 0) {
842+
break;
843+
}
833844
}
834845
}
835846
if(w == 0) {

RoaringBitmap/src/main/java/org/roaringbitmap/buffer/MappeableRunContainer.java

+18-6
Original file line numberDiff line numberDiff line change
@@ -2737,19 +2737,31 @@ protected boolean contains(MappeableBitmapContainer bitmapContainer) {
27372737
}
27382738
final int runCount = numberOfRuns();
27392739
char ib = 0, ir = 0;
2740+
int start = getValue(0);
2741+
int stop = start + getLength(0);
27402742
while(ib < MappeableBitmapContainer.MAX_CAPACITY / 64 && ir < runCount) {
27412743
long w = bitmapContainer.bitmap.get(ib);
2742-
while (w != 0 && ir < runCount) {
2743-
int start = (getValue(ir));
2744-
int stop = start+ (getLength(ir));
2745-
long t = w & -w;
2744+
while (true) {
27462745
long r = ib * 64 + Long.numberOfTrailingZeros(w);
27472746
if (r < start) {
27482747
return false;
2749-
} else if(r > stop) {
2748+
} else if (r > stop) {
27502749
++ir;
2750+
if (ir == runCount) {
2751+
break;
2752+
}
2753+
w &= w - 1;
2754+
start = getValue(ir);
2755+
stop = start + getLength(ir);
2756+
2757+
} else if (ib * 64 + 64 < stop) {
2758+
ib = (char) (stop / 64);
2759+
w = bitmapContainer.bitmap.get(ib);
27512760
} else {
2752-
w ^= t;
2761+
w &= w - 1;
2762+
if (w == 0) {
2763+
break;
2764+
}
27532765
}
27542766
}
27552767
if(w == 0) {

0 commit comments

Comments
 (0)