go-hep.org/x/hep@v0.38.1/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.Add(1)
    62  		go func() {
    63  			h1.Fill(rnd()*100., 1.)
    64  			<-q
    65  			wg.Done()
    66  		}()
    67  	}
    68  	wg.Wait()
    69  }
    70  
    71  func st_process_evts(n int, hists []*H1D, process func(hists []*H1D)) {
    72  	var wg sync.WaitGroup
    73  	for range n {
    74  		wg.Add(1)
    75  		go func() {
    76  			process(hists)
    77  			wg.Done()
    78  		}()
    79  	}
    80  	wg.Wait()
    81  }
    82  
    83  func st_process_evts_const(hists []*H1D) {
    84  	for _, h := range hists {
    85  		h.Fill(10., 1.)
    86  	}
    87  }
    88  func BenchmarkNH1DFillConst(b *testing.B) {
    89  	b.StopTimer()
    90  	hists := make([]*H1D, 100)
    91  	for i := range 100 {
    92  		hists[i] = NewH1D(100, 0., 100.)
    93  	}
    94  	b.StartTimer()
    95  
    96  	for i := 0; i < b.N; i++ {
    97  		st_process_evts(100, hists, st_process_evts_const)
    98  	}
    99  }
   100  
   101  func st_process_evts_flat(hists []*H1D) {
   102  	for _, h := range hists {
   103  		h.Fill(rnd()*100., 1.)
   104  	}
   105  }
   106  
   107  func BenchmarkNH1DFillFlat(b *testing.B) {
   108  	b.StopTimer()
   109  	hists := make([]*H1D, 100)
   110  	for i := range 100 {
   111  		hists[i] = NewH1D(100, 0., 100.)
   112  	}
   113  	b.StartTimer()
   114  
   115  	for i := 0; i < b.N; i++ {
   116  		st_process_evts(100, hists, st_process_evts_flat)
   117  	}
   118  }