From: Dave Cheney Date: Wed, 30 Mar 2016 09:37:51 +0000 (+1100) Subject: cmd/compile/internal/gc: don't let the argument to Fields.Set escape X-Git-Tag: go1.7beta1~998 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ea5091fcd76534565dd76aff593302cd6f5dfcbb;p=gostls13.git cmd/compile/internal/gc: don't let the argument to Fields.Set escape Apply Robert's optimisation from CL 21241 to Type.Fields. The results are less impressive, possibly because of the makeup of the test data. name old time/op new time/op delta Template 365ms ± 5% 365ms ± 3% ~ (p=0.888 n=20+16) Unicode 182ms ±10% 180ms ± 9% ~ (p=0.883 n=20+20) GoTypes 1.14s ± 2% 1.13s ± 3% ~ (p=0.096 n=20+20) Compiler 5.74s ± 1% 5.76s ± 2% ~ (p=0.369 n=20+20) name old alloc/op new alloc/op delta Template 56.8MB ± 0% 56.7MB ± 0% -0.15% (p=0.000 n=19+20) Unicode 38.3MB ± 0% 38.3MB ± 0% -0.02% (p=0.006 n=20+19) GoTypes 180MB ± 0% 180MB ± 0% -0.13% (p=0.000 n=20+20) Compiler 805MB ± 0% 804MB ± 0% -0.05% (p=0.000 n=20+20) name old allocs/op new allocs/op delta Template 485k ± 0% 482k ± 0% -0.54% (p=0.000 n=19+20) Unicode 377k ± 0% 377k ± 0% -0.05% (p=0.005 n=20+20) GoTypes 1.37M ± 0% 1.36M ± 0% -0.53% (p=0.000 n=20+19) Compiler 5.42M ± 0% 5.41M ± 0% -0.21% (p=0.000 n=20+20) Change-Id: I6782659fadd605ce9931bf5c737c7058b96a29eb Reviewed-on: https://go-review.googlesource.com/21296 Reviewed-by: Brad Fitzpatrick --- diff --git a/src/cmd/compile/internal/gc/type.go b/src/cmd/compile/internal/gc/type.go index 6dbfaf1886..a910b105ef 100644 --- a/src/cmd/compile/internal/gc/type.go +++ b/src/cmd/compile/internal/gc/type.go @@ -209,10 +209,13 @@ func (f *Fields) Slice() []*Field { // Set sets f to a slice. // This takes ownership of the slice. func (f *Fields) Set(s []*Field) { - if len(s) != 0 { - f.s = &s - } else { + if len(s) == 0 { f.s = nil + } else { + // Copy s and take address of t rather than s to avoid + // allocation in the case where len(s) == 0. + t := s + f.s = &t } }