go-hep.org/x/hep@v0.40.0/hbook/h1d_bench_test.go (about)

     1  // Copyright ©2020 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package hbook
     6  
     7  import (
     8  	"math/rand"
     9  	"sync"
    10  	"testing"
    11  )
    12  
    13  var (
    14  	seed   = rand.Uint32()
    15  	g_seed = &seed
    16  )
    17  
    18  // rnd is a simple minded non-thread-safe version of math/rand.Float64
    19  func rnd() float64 {
    20  	ss := *g_seed
    21  	ss += ss
    22  	ss ^= 1
    23  	if int32(ss) < 0 {
    24  		ss ^= 0x88888eef
    25  	}
    26  	*g_seed = ss
    27  	return float64(*g_seed%95) / float64(95)
    28  }
    29  
    30  func BenchmarkH1DSTFillConst(b *testing.B) {
    31  	b.StopTimer()
    32  	h1 := NewH1D(100, 0., 100.)
    33  	b.StartTimer()
    34  
    35  	for i := 0; i < b.N; i++ {
    36  		h1.Fill(10., 1.)
    37  	}
    38  }
    39  
    40  func BenchmarkH1DFillFlat(b *testing.B) {
    41  	b.StopTimer()
    42  	h1 := NewH1D(100, 0., 100.)
    43  	b.StartTimer()
    44  
    45  	for i := 0; i < b.N; i++ {
    46  		h1.Fill(rnd()*100., 1.)
    47  	}
    48  }
    49  
    50  func BenchmarkH1DFillFlatGo(b *testing.B) {
    51  	b.StopTimer()
    52  	h1 := NewH1D(100, 0., 100.)
    53  	wg := new(sync.WaitGroup)
    54  	//wg.Add(b.N)
    55  	b.StartTimer()
    56  
    57  	// throttle...
    58  	q := make(chan struct{}, 1000)
    59  	for i := 0; i < b.N; i++ {
    60  		q <- struct{}{}
    61  		wg.Go(func() {
    62  			h1.Fill(rnd()*100., 1.)
    63  			<-q
    64  		})
    65  	}
    66  	wg.Wait()
    67  }
    68  
    69  func st_process_evts(n int, hists []*H1D, process func(hists []*H1D)) {
    70  	var wg sync.WaitGroup
    71  	for range n {
    72  		wg.Go(func() {
    73  			process(hists)
    74  		})
    75  	}
    76  	wg.Wait()
    77  }
    78  
    79  func st_process_evts_const(hists []*H1D) {
    80  	for _, h := range hists {
    81  		h.Fill(10., 1.)
    82  	}
    83  }
    84  func BenchmarkNH1DFillConst(b *testing.B) {
    85  	b.StopTimer()
    86  	hists := make([]*H1D, 100)
    87  	for i := range 100 {
    88  		hists[i] = NewH1D(100, 0., 100.)
    89  	}
    90  	b.StartTimer()
    91  
    92  	for i := 0; i < b.N; i++ {
    93  		st_process_evts(100, hists, st_process_evts_const)
    94  	}
    95  }
    96  
    97  func st_process_evts_flat(hists []*H1D) {
    98  	for _, h := range hists {
    99  		h.Fill(rnd()*100., 1.)
   100  	}
   101  }
   102  
   103  func BenchmarkNH1DFillFlat(b *testing.B) {
   104  	b.StopTimer()
   105  	hists := make([]*H1D, 100)
   106  	for i := range 100 {
   107  		hists[i] = NewH1D(100, 0., 100.)
   108  	}
   109  	b.StartTimer()
   110  
   111  	for i := 0; i < b.N; i++ {
   112  		st_process_evts(100, hists, st_process_evts_flat)
   113  	}
   114  }