【问题标题】:Why doesn't concurrency speed up my fibonacci function?为什么并发不能加速我的斐波那契函数?
【发布时间】: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


【解决方案1】:

这两个版本花费的时间几乎完全相同,因为大部分工作都在 Fibonacci 函数中,所以不管它是运行在主 goroutine 还是单独的 goroutine 上都没有关系。当n 很大时,并发版本可能会更慢,因为通道上的通信开销。

从上图中可以看出,在主线程上运行的唯一工作是 'Println' 调用,它的运行时间非常短。 但是如果在主线程处理数字需要更多时间,使用goroutine生成斐波那契数字可能会更快。

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 2021-03-23
    • 2014-05-03
    • 2019-03-23
    • 1970-01-01
    • 2020-01-18
    • 2012-11-29
    • 2017-07-08
    • 2021-02-14
    相关资源
    最近更新 更多