做爲內置類型,通道(channel)從運行時獲得不少支持,其自身設計也算得上精巧。但無論怎麼說,它本質上依舊是一種隊列,當多個 goroutine 併發操做時,免不了要使用鎖。某些時候,這種競爭機制,會致使性能問題。併發
下面是一個簡單利用 channel 收發數據的示例,爲便於 「準確」 測量收發操做性能,咱們將 make channel 操做放到外部,儘量避免額外消耗。性能
在研究 go runtime 源碼實現過程當中,會看到大量利用 「批操做」 來提高性能的樣例。在此,咱們可借鑑一下,看看效果對比。測試
從測試結果看,性能提高很高,可見批操做是一種有效方案。spa
就此例而言,是否可使用 slice 代替 array 塊?直觀上,slice 可減小經過 channel 傳遞的數據大小,減小數據複製,彷佛可進一步提高性能。不妨作個測試。設計
其結果和前面某章相似,slice 非但沒有提高性能,反而在堆上分配了更多內存,有些得不償失。固然,這個案例未必就是絕對的,全部的性能提高都需依照具體上下文來分析。隊列
最新動態,請掃碼關注圖片