我有一些问题与goroutines。为什么这段代码执行〜125ms的(注意顺序执行):goroutines导致重大减速和头痛
package main
import (
"os/exec"
"time"
"fmt"
)
func main() {
cmd := exec.Command("lessc", "--yui-compress", "test.less")
n := 2000
start := time.Now()
for i := 0; i < n; i++ {
cmd.Run()
}
finish := time.Now()
fmt.Printf("Program took %v to run\n", finish.Sub(start))
}
此代码时需要约20秒(并发执行使用够程):
package main
import (
"os/exec"
"time"
"fmt"
)
func main() {
cmd := exec.Command("lessc", "--yui-compress", "test.less")
ch := make(chan bool)
n := 2000
start := time.Now()
for i := 0; i < n; i++ {
go lessc(ch, cmd)
}
fmt.Println(n, " goroutines started.")
for i := 0; i < n; i++ {
_ = <-ch
}
finish := time.Now()
fmt.Printf("Program took %v to run\n", finish.Sub(start))
}
func lessc(ch chan bool, c *exec.Cmd) {
c.Run()
ch <- true
}
使用去1.0.3上i7 720QM(4C/8T)8GB RAM linux/x86-64 也使用1.0.2构建和测试,并在同一台机器上得到同样的问题。
编辑:由@jnml解决下面。如果有人关心这里的新的固定并发代码,它是:
package main
import (
"os/exec"
"time"
"fmt"
)
func main() {
ch := make(chan bool)
n := 2000
start := time.Now()
for i := 0; i < n; i++ {
go lessc(ch)
}
fmt.Println(n, " goroutines started.")
for i := 0; i < n; i++ {
_ = <-ch
}
finish := time.Now()
fmt.Printf("Program took %v to run\n", finish.Sub(start))
}
func lessc(ch chan bool) {
cmd := exec.Command("lessc", "--yui-compress", "test.less")
cmd.Run()
ch <- true
}
我正在使用Go 1.0.3。我将恢复到1.0.2并重建它们以查看它是否对我有所帮助。 –
我使用go 1.0.2构建它之后,我仍然遇到同样的问题。 –
目前还不清楚你的测试应该做什么,但'testing.B'将会更好地测试两段代码之间的性能差异。 – Dustin