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 }