我正在我的VirtualBoxed Ubuntu 11.4上测试这个Go代码
package main
import ("fmt";"time";"big")
var c chan *big.Int
func sum( start,stop,step int64) {
bigStop := big.NewInt(stop)
bigStep := big.NewInt(step)
bigSum := big.NewInt(0)
for i := big.NewInt(start);i.Cmp(bigStop)<0 ;i.Add(i,bigStep){
bigSum.Add(bigSum,i)
}
c<-bigSum
}
func main() {
s := big.NewInt( 0 )
n := time.Nanoseconds()
step := int64(4)
c = make( chan *big.Int , int(step))
stop := int64(100000000)
for j:=int64(0);j<step;j++{
go sum(j,stop,step)
}
for j:=int64(0);j<step;j++{
s.Add(s,<-c)
}
n = time.Nanoseconds() - n
fmt.Println(s,float64(n)/1000000000.)
}
Ubuntu可以访问我的所有4个核心。我通过同时运行几个可执行文件和系统监视器来检查这个。 但是,当我尝试运行此代码时,它只使用一个核心,并没有获得并行处理的任何利润。
我做错了什么?
答案 0 :(得分:24)
您可能需要查看Concurrency section of the Go FAQ,特别是这两个问题,并确定哪些(如果不是两者)适用于您的案例:
为什么我的多goroutine程序没有 使用多个CPU?
您必须设置GOMAXPROCS shell环境 变量或使用类似命名的function 允许运行时的运行时包 支持使用多个OS线程。
执行并行计算的程序 应该受益于GOMAXPROCS的增加。 但请注意concurrency is not parallelism。
为什么使用GOMAXPROCS&gt; 1 有时让我的程序变慢?
这取决于你的性质 程序。包含多个的程序 花了很多时间的goroutines 在频道上进行沟通 体验性能下降 使用多个OS线程时这个 是因为重要的 涉及的上下文切换惩罚 在线程之间发送数据。
Go的goroutine调度程序不是 好的,因为它需要。将来,它 应该承认这种情况和 优化其对OS线程的使用。对于 现在,GOMAXPROCS应该设置为 每个应用程序。
有关此主题的更多详细信息,请参阅 题为Concurrency is not Parallelism的讨论。