当打印时间成本时,goroutines会相互影响

时间:2017-06-29 02:23:55

标签: go goroutine

我是Golang的新生。我知道goroutine是一个抽象的cpu和内存组来运行一段代码。

所以当我在goroutines中运行一些计算功能(比如排序)时,我希望它们并行运行。但印刷结果似乎很奇怪," paralell"代码打印几乎与成本相同。

为什么呢?有没有我错过goroutine的东西,或者因为func printTime()?

代码:https://play.golang.org/p/n9DLn57ftM

P.S。应将代码复制到本地go文件并运行。在play.golang中运行的那些有一些限制。

结果是:

 <?php

function test() {
echo "Test";
}

add_action('wp_enqueue_scripts','test');

?>

3 个答案:

答案 0 :(得分:1)

您应该衡量总时间成本,而不是每个排序算法所需的个人时间成本。当任务分配到多个goroutines时,单个时间成本可能会更长,因为它需要额外的时间来设置goroutine。根据程序的性质,goroutine和/或主进程之间的通信可能需要额外的时间。有一些与goroutine相关的资源,例如

  1. Is a Go goroutine a coroutine?
  2. http://divan.github.io/posts/go_concurrency_visualize/
  3. 如果您将main功能更改为:

    func main() {
        fmt.Println("MaxProcs:", runtime.GOMAXPROCS(0)) // 8
    
        start := time.Now()
        sequentialTest()
        seq := time.Now()
        concurrentTest()
        con := time.Now()
    
        fmt.Printf("\n\nCalculation time, sequential: %v, concurrent: %v\n",
            seq.Sub(start), con.Sub(seq))
    }
    

    输出结果如下:

    MaxProcs: 4
    
    Source : 3.0037ms
    Quick sort : 5.0034ms
    Merge sort : 13.0069ms
    Insertion sort : 1.2590941s
    Goroutine num: 1
    
    Source : 3.0015ms
    Goroutine num: 4
    
    Insertion sort : 1.2399076s
    Quick sort : 1.2459121s
    Merge sort : 1.2519156s
    
    Calculation time, sequential: 1.2831112s, concurrent: 1.2559194s
    

    删除printTime后,它看起来像是:

    MaxProcs: 4
    Goroutine num: 1
    Goroutine num: 4
    
    Calculation time, sequential: 1.3154314s, concurrent: 1.244112s
    

    时间成本值可能略有变化,但大部分时间结果为sequential > concurrent。总之,将任务分配到多个goroutines,可能会提高整体性能(时间成本),但不会增加单个任务。

答案 1 :(得分:0)

抱歉,我不明白你想测试什么。首先,您的代码不适用于quickSort,因为您使用Event.joins(:eventdates).joins(:categories).where ("eventdates.start_date = ? AND city = ? AND categories.name = ?", params[:event][:date], params[:event][:city], params[:event][:category]).all 运行quickSort。

go quickSort(...)

这个goroutine将立即退出。 现在,我测试了你的代码。而且我注意到你必须在开始和完成之间获得总时间。

https://play.golang.org/p/O8Gj-OYIdR

答案 2 :(得分:0)

wg.Add(1)
go func(){
    go quickSort(s1, nil)
    wg.Done()
}()

您不需要第二个go

应该是

wg.Add(1)
go func(){
    quickSort(s1, nil)
    wg.Done()
}()

发生的事情是,func()启动了一个goroutine,而go quickSort(s1, nil)启动了另一个goroutine。结果,wg.Done()(以及因此,wg.Done())几乎立即执行(无需等待quickSort)。