From d13b937315e457bf4691f7d1b3cd40ec7652ff60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Wed, 27 Apr 2022 22:49:08 +0200 Subject: [PATCH 1/3] lhef: reduce allocs in NewDecoder Allocate arrays in one block in lhef.NewDecoder. --- lhef/reader.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lhef/reader.go b/lhef/reader.go index 594e4806d..7dcab725d 100644 --- a/lhef/reader.go +++ b/lhef/reader.go @@ -122,12 +122,17 @@ Loop: return nil, err } - d.Run.XSECUP = make([]float64, int(d.Run.NPRUP)) - d.Run.XERRUP = make([]float64, int(d.Run.NPRUP)) - d.Run.XMAXUP = make([]float64, int(d.Run.NPRUP)) - d.Run.LPRUP = make([]int32, int(d.Run.NPRUP)) + n := int(d.Run.NPRUP) + if n < 0 { + return nil, fmt.Errorf("lhef.Decoder: invalid NPRUP (%d)", d.Run.NPRUP) + } + f64 := make([]float64, 3*n) + d.Run.XSECUP = f64[:n:n] + d.Run.XERRUP = f64[n : 2*n : 2*n] + d.Run.XMAXUP = f64[2*n:] + d.Run.LPRUP = make([]int32, n) - for i := 0; i < int(d.Run.NPRUP); i++ { + for i := 0; i < n; i++ { _, err = fmt.Fscanf( buf, "%f %f %f %d\n", From 1f7aaf15ac71eea7b439210feb32909397c0d397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Wed, 27 Apr 2022 22:56:58 +0200 Subject: [PATCH 2/3] lhef: more Decoder tests --- lhef/reader_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lhef/reader_test.go b/lhef/reader_test.go index c9bd160cc..e7c6d2e92 100644 --- a/lhef/reader_test.go +++ b/lhef/reader_test.go @@ -27,6 +27,20 @@ func TestLhefReading(t *testing.T) { t.Error(err) } + n := int(dec.Run.NPRUP) + if len(dec.Run.XSECUP) != n || cap(dec.Run.XSECUP) != n { + t.Errorf("invalid XSECUP len") + } + if len(dec.Run.XERRUP) != n || cap(dec.Run.XERRUP) != n { + t.Errorf("invalid XRERUP len") + } + if len(dec.Run.XMAXUP) != n || cap(dec.Run.XMAXUP) != n { + t.Errorf("invalid XMAXUP len") + } + if len(dec.Run.LPRUP) != n || cap(dec.Run.LPRUP) != n { + t.Errorf("invalid LPRUP len") + } + for i := 0; ; i++ { if r_debug { fmt.Printf("===[%d]===\n", i) From 246c5de2792c97aab1442274ba7b1d35583f631f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Wed, 27 Apr 2022 23:24:45 +0200 Subject: [PATCH 3/3] lhef: reduce allocs on event decoding When decoding an event block, allocate memory for slices in bigger blocks to reduce the number of memory allocations. --- lhef/reader.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lhef/reader.go b/lhef/reader.go index 7dcab725d..6cea2408b 100644 --- a/lhef/reader.go +++ b/lhef/reader.go @@ -250,11 +250,13 @@ func (d *Decoder) Decode() (*HEPEUP, error) { n := int(evt.NUP) evt.IDUP = make([]int64, n) evt.ISTUP = make([]int32, n) - evt.MOTHUP = make([][2]int32, n) - evt.ICOLUP = make([][2]int32, n) + n2 := make([][2]int32, 2*n) + evt.MOTHUP = n2[:n:n] + evt.ICOLUP = n2[n:] evt.PUP = make([][5]float64, n) - evt.VTIMUP = make([]float64, n) - evt.SPINUP = make([]float64, n) + f64 := make([]float64, 2*n) + evt.VTIMUP = f64[:n:n] + evt.SPINUP = f64[n:] for i := 0; i < n; i++ { _, err = fmt.Fscanf( buf,