@@ -2384,3 +2384,116 @@ func TestIterateHalt(t *testing.T) {
23842384 expected = expected [0 : len (expected )- 1 ]
23852385 assert .Equal (t , expected , values )
23862386}
2387+
2388+ func BenchmarkEvenIntervalArrayUnions (b * testing.B ) {
2389+ inputBitmaps := make ([]* Bitmap , 40 )
2390+ for i := 0 ; i < 40 ; i ++ {
2391+ bitmap := NewBitmap ()
2392+ for j := 0 ; j < 100 ; j ++ {
2393+ bitmap .Add (uint32 (2 * (j + 10 * i )))
2394+ }
2395+ inputBitmaps [i ] = bitmap
2396+ }
2397+
2398+ b .ResetTimer ()
2399+ b .ReportAllocs ()
2400+ for i := 0 ; i < b .N ; i ++ {
2401+ bitmap := NewBitmap ()
2402+ for _ , input := range inputBitmaps {
2403+ bitmap .Or (input )
2404+ }
2405+ }
2406+ }
2407+
2408+ func BenchmarkInPlaceArrayUnions (b * testing.B ) {
2409+ rand .Seed (100 )
2410+ b .ReportAllocs ()
2411+ componentBitmaps := make ([]* Bitmap , 100 )
2412+ for i := 0 ; i < 100 ; i ++ {
2413+ bitmap := NewBitmap ()
2414+ for j := 0 ; j < 100 ; j ++ {
2415+ //keep all entries in [0,4096), so they stay arrays.
2416+ bitmap .Add (uint32 (rand .Intn (arrayDefaultMaxSize )))
2417+ }
2418+ componentBitmaps [i ] = bitmap
2419+ }
2420+ b .ResetTimer ()
2421+ for i := 0 ; i < b .N ; i ++ {
2422+ bitmap := NewBitmap ()
2423+ for j := 0 ; j < 100 ; j ++ {
2424+ bitmap .Or (componentBitmaps [rand .Intn (100 )])
2425+ }
2426+ }
2427+ }
2428+
2429+ func BenchmarkAntagonisticArrayUnionsGrowth (b * testing.B ) {
2430+ left := NewBitmap ()
2431+ right := NewBitmap ()
2432+ for i := 0 ; i < 4096 ; i ++ {
2433+ left .Add (uint32 (2 * i ))
2434+ right .Add (uint32 (2 * i + 1 ))
2435+ }
2436+ b .ReportAllocs ()
2437+ b .ResetTimer ()
2438+ for i := 0 ; i < b .N ; i ++ {
2439+ left .Clone ().Or (right )
2440+ }
2441+ }
2442+
2443+ func BenchmarkRepeatedGrowthArrayUnion (b * testing.B ) {
2444+ b .ReportAllocs ()
2445+ for i := 0 ; i < b .N ; i ++ {
2446+ sink := NewBitmap ()
2447+ source := NewBitmap ()
2448+ for i := 0 ; i < 2048 ; i ++ {
2449+ source .Add (uint32 (2 * i ))
2450+ sink .Or (source )
2451+ }
2452+ }
2453+ }
2454+
2455+ func BenchmarkRepeatedSelfArrayUnion (b * testing.B ) {
2456+ bitmap := NewBitmap ()
2457+ for i := 0 ; i < 4096 ; i ++ {
2458+ bitmap .Add (uint32 (2 * i ))
2459+ }
2460+ b .ReportAllocs ()
2461+ b .ResetTimer ()
2462+ for i := 0 ; i < b .N ; i ++ {
2463+ receiver := NewBitmap ()
2464+ for j := 0 ; j < 1000 ; j ++ {
2465+ receiver .Or (bitmap )
2466+ }
2467+ }
2468+ }
2469+
2470+ // BenchmarkArrayIorMergeThreshold tests performance
2471+ // when unioning two array containers when the cardinality sum is over 4096
2472+ func BenchmarkArrayUnionThreshold (b * testing.B ) {
2473+ testOddPoint := map [string ]int {
2474+ "mostly-overlap" : 4900 ,
2475+ "little-overlap" : 2000 ,
2476+ "no-overlap" : 0 ,
2477+ }
2478+ for name , oddPoint := range testOddPoint {
2479+ b .Run (name , func (b * testing.B ) {
2480+ left := NewBitmap ()
2481+ right := NewBitmap ()
2482+ for i := 0 ; i < 5000 ; i ++ {
2483+ if i % 2 == 0 {
2484+ left .Add (uint32 (i ))
2485+ }
2486+ if i % 2 == 0 && i < oddPoint {
2487+ right .Add (uint32 (i ))
2488+ } else if i % 2 == 1 && i >= oddPoint {
2489+ right .Add (uint32 (i ))
2490+ }
2491+ }
2492+ b .ResetTimer ()
2493+ b .ReportAllocs ()
2494+ for i := 0 ; i < b .N ; i ++ {
2495+ right .Clone ().Or (left )
2496+ }
2497+ })
2498+ }
2499+ }
0 commit comments