From b4f6dd0edcf15a96160155754f05616146ebdd97 Mon Sep 17 00:00:00 2001 From: Perfloop Agent Date: Wed, 19 Aug 2026 13:49:52 +0000 Subject: [PATCH 1/2] Add SumBigValues benchmark --- roaring64/bsi64_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/roaring64/bsi64_test.go b/roaring64/bsi64_test.go index 39dbdcde..1a06371a 100644 --- a/roaring64/bsi64_test.go +++ b/roaring64/bsi64_test.go @@ -822,6 +822,31 @@ func TestSumWithNil(t *testing.T) { assert.Equal(t, int64(0), sum) } +func BenchmarkBSI64SumBigValues(b *testing.B) { + const valueCount = 128 + + bsi := NewBSI(Max64BitSigned, 0) + foundSet := bsi.GetExistenceBitmap() + want := new(big.Int) + for columnID := uint64(0); columnID < valueCount; columnID++ { + value := int64(columnID) + bsi.SetValue(columnID, value) + want.Add(want, big.NewInt(value)) + } + if bsi.BitCount() != 63 { + b.Fatalf("BitCount() = %d, want 63", bsi.BitCount()) + } + + var sum *big.Int + var count uint64 + for b.Loop() { + sum, count = bsi.SumBigValues(foundSet) + } + if count != valueCount || sum.Cmp(want) != 0 { + b.Fatalf("SumBigValues() = (%v, %d), want (%v, %d)", sum, count, want, valueCount) + } +} + func TestTransposeWithCountsNil(t *testing.T) { bsi := setup() bsi.SetValue(101, 50) From 83c91fb8d27e44ca589efee80e650a086e8c12f0 Mon Sep 17 00:00:00 2001 From: Perfloop Agent Date: Wed, 19 Aug 2026 13:51:37 +0000 Subject: [PATCH 2/2] Avoid goroutine fan-out in SumBigValues --- roaring64/bsi64.go | 26 ++++++++++---------------- roaring64/bsi64_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/roaring64/bsi64.go b/roaring64/bsi64.go index 134eb58c..a58d8e0c 100644 --- a/roaring64/bsi64.go +++ b/roaring64/bsi64.go @@ -1131,22 +1131,16 @@ func (b *BSI) SumBigValues(foundSet *Bitmap) (sum *big.Int, count uint64) { } sum = new(big.Int) count = foundSet.GetCardinality() - resultsChan := make(chan int64, b.BitCount()) - var wg sync.WaitGroup - for i := 0; i < b.BitCount(); i++ { - wg.Add(1) - go func(j int) { - defer wg.Done() - resultsChan <- int64(foundSet.AndCardinality(&b.bA[j]) << uint(j)) - }(i) - } - wg.Wait() - close(resultsChan) - - for val := range resultsChan { - sum.Add(sum, big.NewInt(val)) - } - sum.Sub(sum, big.NewInt(int64(foundSet.AndCardinality(&b.bA[b.BitCount()])<