Go 性能優化技巧 9/10

做爲內置類型,通道(channel)從運行時獲得不少支持,其自身設計也算得上精巧。但無論怎麼說,它本質上依舊是一種隊列,當多個 goroutine 併發操做時,免不了要使用鎖。某些時候,這種競爭機制,會致使性能問題。併發

下面是一個簡單利用 channel 收發數據的示例,爲便於 「準確」 測量收發操做性能,咱們將 make channel 操做放到外部,儘量避免額外消耗。性能

圖片描述

在研究 go runtime 源碼實現過程當中,會看到大量利用 「批操做」 來提高性能的樣例。在此,咱們可借鑑一下,看看效果對比。測試

圖片描述
圖片描述
圖片描述

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

就此例而言,是否可使用 slice 代替 array 塊?直觀上,slice 可減小經過 channel 傳遞的數據大小,減小數據複製,彷佛可進一步提高性能。不妨作個測試。設計

圖片描述
圖片描述
圖片描述

其結果和前面某章相似,slice 非但沒有提高性能,反而在堆上分配了更多內存,有些得不償失。固然,這個案例未必就是絕對的,全部的性能提高都需依照具體上下文來分析。隊列

最新動態,請掃碼關注
圖片描述圖片

相關文章
相關標籤/搜索