我是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');
?>
答案 0 :(得分:1)
您应该衡量总时间成本,而不是每个排序算法所需的个人时间成本。当任务分配到多个goroutines
时,单个时间成本可能会更长,因为它需要额外的时间来设置goroutine
。根据程序的性质,goroutine
和/或主进程之间的通信可能需要额外的时间。有一些与goroutine
相关的资源,例如
如果您将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将立即退出。 现在,我测试了你的代码。而且我注意到你必须在开始和完成之间获得总时间。
答案 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)。