儘管反射(reflect)存在效能問題,但依然被頻繁使用,以彌補靜態語言在動態行為上的不足。只是某些時候,我們須對此做些變通,以提公升效能。
為便於閱讀,以下示例均做了最大程度精簡。
如果是 reflect.type,可將其快取,避免重複操作耗時。但 value 顯然不行,因為它和具體物件繫結,內部儲存例項指標。換個思路,字段相對於結構,除名稱(name)外,還有偏移量(offset)這個唯一屬性。利用偏移量,將 fieldbyname 變為普通指標操作,就可以實現效能提公升。
測試一下優化成果。
效果很好,不是嗎?剩餘的問題是,如何設計快取結構,這個 offset 變數自然不能用於實際開發。
用 map[type]map[name]offset?顯然不行。每次執行 reflect.typeof,這於效能優化不利。可除了 type,還有什麼可以作為 key 使用?要知道,介面由 itab 和 data 指標組成,相同型別(介面和實際型別組合)的 itab 指標相同,自然也可當作 key 來用。
雖因引入 map 導致效能有所下降,但相比直接使用 reflect 還是提公升很多。
利用指標型別轉換實現效能優化,本就是 「非常手段」,是一種為了效能而放棄 「其他」 的做法。與其擔心**是否適應未來的變化,不如寫個單元測試,確保在公升級時做出必要的安全檢查。還有,本優化系列,僅僅提供一種優化思路,未必要照抄。
Go 效能優化技巧 2 10
對於一些初學者,自知道 go 裡面的 array 以 pass by value 方式傳遞後,就莫名地引起 恐慌 外加諸多文章未作說明,就建議用 slice 代替 array,企圖避免資料拷貝,提公升效能。實際上,此做法有待商榷。某些時候怕會適得其反,倒造成不必要的效能損失。用個簡單的示例說明。pa...
Go 效能優化技巧 7 10
介面的用途無需多言。但這並不意味著可在任何場合使用介面,要知道通過介面呼叫和普通呼叫存在很大差別。首先,相比靜態繫結,動態繫結效能要差很多 其次,執行期需額外開銷,比如介面會複製物件,哪怕僅是個指標,也會在堆上增加乙個需 gc 處理的目標。顯然,對於壓力很大的內部元件之間,用介面有些得不償失。對比介...
Oracle SQL 效能優化技巧
sun2004發表於 2008 12 25 11 28 眾所周知,資料庫設計的好壞直接關係到資料庫執行的效率。根據筆者的經驗,對於提公升資料庫效能來說,合理的資料庫設計,比公升級伺服器的硬體配置,還要來的有效。但是,筆者無論是在跟同事合作,又或者是在論壇上跟相關同行交流的時候,總是會發現有些人有一些...