From d1887676d96daf969d886a4ec13cbad4908d51af Mon Sep 17 00:00:00 2001 From: Daniel Martí Date: Sun, 3 Mar 2019 23:52:00 +0000 Subject: os/exec: less allocs in the common case MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Stdin, Stdout, and Stderr are nil, there are no goroutines to keep track of, so we don't need a channel. And in startProcess, preallocate the right size for sysattr.Files, saving a bit of space and a couple of slice growth allocs. name old time/op new time/op delta ExecHostname-8 419µs ± 0% 417µs ± 1% ~ (p=0.093 n=6+6) name old alloc/op new alloc/op delta ExecHostname-8 6.40kB ± 0% 6.28kB ± 0% -1.86% (p=0.002 n=6+6) name old allocs/op new allocs/op delta ExecHostname-8 34.0 ± 0% 31.0 ± 0% -8.82% (p=0.002 n=6+6) Change-Id: Ic1d617f29e9c6431cdcadc7f9bb992750a6d5f48 Reviewed-on: https://go-review.googlesource.com/c/164801 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/exec/exec.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/os/exec/exec.go') diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go index 30fd64a4b1..424b49cf06 100644 --- a/src/os/exec/exec.go +++ b/src/os/exec/exec.go @@ -404,11 +404,14 @@ func (c *Cmd) Start() error { c.closeDescriptors(c.closeAfterStart) - c.errch = make(chan error, len(c.goroutine)) - for _, fn := range c.goroutine { - go func(fn func() error) { - c.errch <- fn() - }(fn) + // Don't allocate the channel unless there are goroutines to fire. + if len(c.goroutine) > 0 { + c.errch = make(chan error, len(c.goroutine)) + for _, fn := range c.goroutine { + go func(fn func() error) { + c.errch <- fn() + }(fn) + } } if c.ctx != nil { -- cgit v1.3-5-g9baa