1 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
并發(fā)不是并行。通道的這種特殊使用結(jié)果與僅從 返回值非常相似removeDuplicates
,只是兩個(gè) goroutine 需要協(xié)調(diào)它們對(duì)通道的使用會(huì)產(chǎn)生額外的開銷。
具體來(lái)說(shuō):
循環(huán)的每次迭代都有自己的通道,每個(gè)通道只能容納一個(gè)元素。
在所有語(yǔ)句都已執(zhí)行之前,循環(huán)無(wú)法繼續(xù)下一次迭代,包括對(duì)該語(yǔ)句的調(diào)用
log.Printf
阻塞,直到從通道接收到值。removeDuplicates
檢測(cè)到實(shí)時(shí)時(shí)間已經(jīng)過(guò)去了多少,而不是在解決問(wèn)題上花費(fèi)了多少時(shí)間。這是評(píng)論說(shuō)它首先不是一個(gè)很好的基準(zhǔn)的眾多原因之一。
推測(cè):在循環(huán)的前幾次迭代中,goroutine 可能removeDuplicates
會(huì)初始化start
,然后將執(zhí)行時(shí)間交給主 goroutine。然后 main goroutine 立即檢查 mutex on?c
,發(fā)現(xiàn)它還不能做任何事情,并返回給調(diào)度程序,所有這些檢查和上下文切換增加了數(shù)千納秒(關(guān)心這通常是微基準(zhǔn)測(cè)試的味道)到goroutineremoveDuplicates
的實(shí)時(shí)執(zhí)行。main
在幾次迭代之后,某些東西(也許是 Go 運(yùn)行時(shí))發(fā)現(xiàn)了在返回之前永遠(yuǎn)無(wú)法取得進(jìn)展的事實(shí)removeDuplicates
,并且避免了上下文切換。
我知道此時(shí)您對(duì)解釋比建議更感興趣,但如果我不指出比較 Go 和 Java 的基準(zhǔn)已經(jīng)存在,我會(huì)覺(jué)得很不負(fù)責(zé)任。即使您想自己編寫,我也建議使用類似的方法:根據(jù)需要完成的任務(wù)定義基準(zhǔn)程序,然后使用每種語(yǔ)言(或框架)中可用的最佳工具來(lái)完成工作具有良好的性能。
- 1 回答
- 0 關(guān)注
- 134 瀏覽
添加回答
舉報(bào)