Go 效能優化技巧 9 10

2022-06-23 20:38:55 字數 852 閱讀 1379

作為內建型別,通道(channel)從執行時得到很多支援,其自身設計也算得上精巧。但不管怎麼說,它本質上依舊是一種佇列,當多個 goroutine 併發操作時,免不了要使用鎖。某些時候,這種競爭機制,會導致效能問題。

下面是一個簡單利用 channel 收發資料的示例,為便於 “準確” 測量收發操作效能,我們將 make channel 操作放到外部,儘可能避免額外消耗。

在研究 go runtime 原始碼實現過程中,會看到大量利用 “批操作” 來提升效能的樣例。在此,我們可借鑑一下,看看效果對比。

從測試結果看,效能提升很高,可見批操作是一種有效方案。

就此例而言,是否可以使用 slice 代替 array 塊?直觀上,slice 可減少通過 channel 傳遞的資料大小,減少資料複製,似乎可進一步提升效能。不妨做個測試。

其結果和前面某章類似,slice 非但沒有提升效能,反而在堆上分配了更多記憶體,有些得不償失。當然,這個案例未必就是絕對的,所有的效能提升都需依照具體上下文來分析。