作為內(nèi)置類型,通道(channel)從運行時得到很多支持,其自身設(shè)計也算得上精巧。但不管怎么說,它本質(zhì)上依舊是一種隊列,當(dāng)多個 goroutine 并發(fā)操作時,免不了要使用鎖。某些時候,這種競爭機制,會導(dǎo)致性能問題。 下面是一個簡單利用 channel 收發(fā)數(shù)據(jù)的示例,為便于 “準(zhǔn)確” 測量收發(fā)操作性能,我們將 make channel 操作放到外部,盡可能避免額外消耗。 在研究 go runtime 源碼實現(xiàn)過程中,會看到大量利用 “批操作” 來提升性能的樣例。在此,我們可借鑒一下,看看效果對比。 從測試結(jié)果看,性能提升很高,可見批操作是一種有效方案。 就此例而言,是否可以使用 slice 代替 array 塊?直觀上,slice 可減少通過 channel 傳遞的數(shù)據(jù)大小,減少數(shù)據(jù)復(fù)制,似乎可進一步提升性能。不妨做個測試。 其結(jié)果和前面某章類似,slice 非但沒有提升性能,反而在堆上分配了更多內(nèi)存,有些得不償失。當(dāng)然,這個案例未必就是絕對的,所有的性能提升都需依照具體上下文來分析。 最新動態(tài),請掃碼關(guān)注 |
|