github.com/apache/arrow/go/v14@v14.0.1/internal/bitutils/bitmap_generate_test.go (about)

     1  // Licensed to the Apache Software Foundation (ASF) under one
     2  // or more contributor license agreements.  See the NOTICE file
     3  // distributed with this work for additional information
     4  // regarding copyright ownership.  The ASF licenses this file
     5  // to you under the Apache License, Version 2.0 (the
     6  // "License"); you may not use this file except in compliance
     7  // with the License.  You may obtain a copy of the License at
     8  //
     9  // http://www.apache.org/licenses/LICENSE-2.0
    10  //
    11  // Unless required by applicable law or agreed to in writing, software
    12  // distributed under the License is distributed on an "AS IS" BASIS,
    13  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  // See the License for the specific language governing permissions and
    15  // limitations under the License.
    16  
    17  package bitutils_test
    18  
    19  import (
    20  	"testing"
    21  
    22  	"github.com/apache/arrow/go/v14/internal/bitutils"
    23  	"golang.org/x/exp/rand"
    24  )
    25  
    26  const kBufferSize int64 = 1024 * 8
    27  
    28  var pattern = []bool{false, false, false, true, true, true}
    29  
    30  func runBench(b *testing.B, bitmap []byte, nbits int64, fn func([]byte, int64, int64, func() bool)) {
    31  	for n := 0; n < b.N; n++ {
    32  		patternIndex := 0
    33  		gen := func() bool {
    34  			b := pattern[patternIndex]
    35  			patternIndex++
    36  			if patternIndex == len(pattern) {
    37  				patternIndex = 0
    38  			}
    39  			return b
    40  		}
    41  
    42  		fn(bitmap, 0, nbits, gen)
    43  	}
    44  }
    45  
    46  func BenchmarkGenerateBits(b *testing.B) {
    47  	nbits := kBufferSize * 8
    48  	// random bytes
    49  	r := rand.New(rand.NewSource(0))
    50  	bitmap := make([]byte, kBufferSize)
    51  	r.Read(bitmap)
    52  
    53  	b.ResetTimer()
    54  	b.SetBytes(kBufferSize)
    55  	runBench(b, bitmap, nbits, bitutils.GenerateBits)
    56  }
    57  
    58  func BenchmarkGenerateBitsUnrolled(b *testing.B) {
    59  	nbits := kBufferSize * 8
    60  	// random bytes
    61  	r := rand.New(rand.NewSource(0))
    62  	bitmap := make([]byte, kBufferSize)
    63  	r.Read(bitmap)
    64  
    65  	b.ResetTimer()
    66  	b.SetBytes(kBufferSize)
    67  	runBench(b, bitmap, nbits, bitutils.GenerateBitsUnrolled)
    68  }