为什么并发不能加快我的斐波那契功能?

时间:2018-07-28 21:12:42

标签: go concurrency goroutine

以下是“环游世界”中的以下并发示例

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加快计算速度的例子?我想知道是否可能有一些编译器设置限制了我的程序可以使用的内核数量。 为什么goroutines不能加快计算速度?

1 个答案:

答案 0 :(得分:2)

这两个版本花费几乎完全相同的时间,因为大多数工作都在Fibonacci函数中进行,因此无论是在主goroutine还是单独的goroutine上运行都无关紧要。当n大时,由于通道上的通信开销,并发版本可能会变慢。

enter image description here

从上图可以看到,在主线程上运行的唯一工作是“ Println”调用,这些调用只需很少的时间即可运行。 但是,如果在主线程上处理数字需要更多时间,则使用goroutine生成斐波那契数可能会更快。