【发布时间】:2018-07-28 21:12:42
【问题描述】:
这是来自 A Tour of Go 的以下并发示例
package main
import (
"fmt"
)
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
for i := range c {
fmt.Println(i)
}
}
我将其修改为不使用 goroutine:
package main
import (
"fmt"
)
func fibonacci(n int) int{
if(n==0||n==1){
return 1
}
x:= 1
y:= 1
for i := 0; i < n; i++ {
tmp := x
x = y
y = tmp + y
fmt.Println(x)
}
return x
}
func main(){
fibonacci2(100)
}
但是,在 n = 100000 时,它所花费的时间几乎都是瞬间的。 有没有人举个例子,goroutines 可以加快计算速度?我想知道是否可能有一些编译器设置限制了我的程序可以使用的内核数量。 为什么 goroutine 不加快计算速度?
【问题讨论】:
-
第一步是让代码不是“几乎即时”——对于性能分析,应该建立一个“并非无关紧要”的基线 D:
-
并发 != 并行度。
-
@user2864740 将 n 增加到 10 亿。并发代码大约慢 30-50%。 665 毫秒与 428 毫秒。我运行了 10 次只是为了解释差异。
标签: go concurrency goroutine