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 }