这是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)
}
}
我将其修改为不使用goroutines:
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加快计算速度的例子?我想知道是否可能有一些编译器设置限制了我的程序可以使用的内核数量。
为什么goroutines不能加快计算速度?
最佳答案
这两个版本花费几乎完全相同的时间,因为大多数工作都在Fibonacci函数中进行,因此无论是在主goroutine还是单独的goroutine上运行都无关紧要。当n
大时,由于通道上的通信开销,并发版本可能会变慢。
从上图可以看出,在主线程上运行的唯一工作是'Println'调用,这些调用只需很少的时间即可运行。
但是,如果在主线程上处理数字需要更多时间,则使用goroutine生成斐波那契数可能会更快。