Go 效能最佳化技巧 8/10

來源:互聯網
上載者:User

標籤:

儘管反射(reflect)存在效能問題,但依然被頻繁使用,以彌補靜態語言在動態行為上的不足。只是某些時候,我們須對此做些變通,以提升效能。

為便於閱讀,以下樣本均做了最大程度精簡。

如果是 reflect.Type,可將其緩衝,避免重複操作耗時。但 Value 顯然不行,因為它和具體對象綁定,內部儲存執行個體指標。換個思路,欄位相對於結構,除名稱(name)外,還有位移量(offset)這個唯一屬性。利用位移量,將 FieldByName 變為普通指標操作,就可以實現效能提升。

測試一下最佳化成果。


效果很好,不是嗎?剩餘的問題是,如何設計緩衝結構,這個 offset 變數自然不能用於實際開發。

用 map[Type]map[name]offset?顯然不行。每次執行 reflect.TypeOf,這於效能最佳化不利。可除了 Type,還有什麼可以作為 Key 使用?要知道,介面由 itab 和 data 指標組成,相同類型(介面和實際類型組合)的 itab 指標相同,自然也可當作 key 來用。


雖因引入 map 導致效能有所下降,但相比直接使用 reflect 還是提升很多。

利用指標類型轉換實現效能最佳化,本就是 “非常手段”,是一種為了效能而放棄 “其他” 的做法。與其擔心代碼是否適應未來的變化,不如寫個單元測試,確保在升級時做出必要的安全檢查。還有,本最佳化系列,僅僅提供一種最佳化思路,未必要照抄。

最新動向,請掃碼關注

Go 效能最佳化技巧 8/10

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.