From 3f3cc605314c9f1ccf88873ae2b95af7beca7c41 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 18 Sep 2017 10:30:19 -0500 Subject: [PATCH] micro optimization to bitmap difference --- roaring/roaring.go | 21 +++++++++++---------- roaring/roaring_test.go | 10 ++++++++++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/roaring/roaring.go b/roaring/roaring.go index 151ab7f2c..85721468a 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -422,24 +422,25 @@ func (b *Bitmap) Difference(other *Bitmap) *Bitmap { ki, ci := b.keys, b.containers kj, cj := other.keys, other.containers + ni, nj := len(ki), len(kj) + i, j := 0, 0 for { var key uint64 var container *container - ni, nj := len(ki), len(kj) - if ni == 0 { // eof(i) + if ni == i { // eof(i) break - } else if nj == 0 || ki[0] < kj[0] { // eof(j) or i < j - key, container = ki[0], ci[0].clone() - ki, ci = ki[1:], ci[1:] + } else if nj == j || ki[i] < kj[j] { // eof(j) or i < j + key, container = ki[i], ci[i].clone() + i++ output.keys = append(output.keys, key) output.containers = append(output.containers, container) - } else if nj > 0 && ki[0] > kj[0] { // i > j - kj, cj = kj[1:], cj[1:] + } else if nj > j && ki[i] > kj[j] { // i > j + j++ } else { // i == j - key, container = ki[0], difference(ci[0], cj[0]) - ki, ci = ki[1:], ci[1:] - kj, cj = kj[1:], cj[1:] + key, container = ki[i], difference(ci[i], cj[j]) + i++ + j++ output.keys = append(output.keys, key) output.containers = append(output.containers, container) } diff --git a/roaring/roaring_test.go b/roaring/roaring_test.go index 7e524f51f..a5ac7a30f 100644 --- a/roaring/roaring_test.go +++ b/roaring/roaring_test.go @@ -24,6 +24,7 @@ import ( "testing" "testing/quick" + "github.com/pilosa/pilosa" "github.com/pilosa/pilosa/roaring" _ "github.com/pilosa/pilosa/test" ) @@ -487,6 +488,15 @@ func TestBitmap_Difference(t *testing.T) { } } +func TestBitmap_Difference2(t *testing.T) { + bm0 := roaring.NewBitmap(0, 1, 2, 131072, 262144, pilosa.SliceWidth+5, pilosa.SliceWidth+7) + bm1 := roaring.NewBitmap(2, 3, 100000, 262144, 2*pilosa.SliceWidth+1) + result := bm0.Difference(bm1) + if !reflect.DeepEqual(result.Slice(), []uint64{0, 1, 131072, pilosa.SliceWidth + 5, pilosa.SliceWidth + 7}) { + t.Fatalf("unexpected : %v", result.Slice()) + } +} + func TestBitmap_Difference_Empty(t *testing.T) { bm0 := roaring.NewBitmap(0, 2683177) bm1 := roaring.NewBitmap()