diff options
| author | Daniel Martí <mvdan@mvdan.cc> | 2019-03-03 23:52:00 +0000 |
|---|---|---|
| committer | Daniel Martí <mvdan@mvdan.cc> | 2019-03-04 09:45:46 +0000 |
| commit | d1887676d96daf969d886a4ec13cbad4908d51af (patch) | |
| tree | e16c3c152950f50775f254b4b338ab29db55de66 /src/os/exec/exec.go | |
| parent | 0db5534d7acb3c5ce39145ec3aaa490cca1a81ea (diff) | |
| download | go-d1887676d96daf969d886a4ec13cbad4908d51af.tar.xz | |
os/exec: less allocs in the common case
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í <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/os/exec/exec.go')
| -rw-r--r-- | src/os/exec/exec.go | 13 |
1 files changed, 8 insertions, 5 deletions
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 { |
