物件 介面效能損失

2021-10-25 08:31:04 字數 739 閱讀 2044

type xer inte***ce 

type x int

func (x) a(b int)

func main()

$ go build && go tool objdump -s "main\.main" test
動態呼叫消耗不大,主要影響是物件逃逸和無法內聯。

使用介面的時候,從靜態繫結變成動態繫結不會有很大的性損失,動態查詢的過程實際上很精簡無非十幾條指令。介面造成的效能損失不是動態呼叫。主要的損失可能會導致記憶體逃逸,物件複製,如果指標傳遞可能導致物件本來在棧上結果在另外地方有乙個指標去引用它,可能導致物件從棧上跑到堆上。記憶體逃逸會導致效能損失,因為在堆上分配物件代價比較大。還有就是方法需要動態呼叫可能造成沒有辦法內聯。原來方法呼叫是可以內聯的通過介面呼叫不能內聯可能會帶來一定的效能損失。

先通過方法來呼叫,a可以內聯的也沒有發生逃逸行為。如果通過介面來呼叫的時候發現有逃逸。內聯可能就取消了。

關於介面什麼時候該用什麼時候不該用的問題。假設一開始是在乙個設計層面上,在設計的時候很少會涉及到細節,更多是基於比較大的模組去設計,設計的時候,往往是由單個人和單個團隊完成的。在編碼上由單個人完成的時候,最大的要求是效能,很多優化的細節是盡可能的減少額外中間環節,因為整個**權在個人的控制範圍之內,而且內部的細節沒有必要公開。當設計這樣乙個模組時候,涉及到內部的構造不應該用介面,中間環節越少越好,因為整個**都在

Docker 有效能損失嗎?

docker 有效能損失嗎?docker有效能損失,但是很小,相對docker的出色的功能,這點的效能損失是可以忽略不計的,docker是乙個開源的應用容器引擎,可以讓開發者打包應用到乙個容器中,然後發布到任何流行的linux機器上執行。docker docker 是乙個開源的應用容器引擎,讓開發者...

虛函式所造成的效能損失

假設在乙個執行緒同步環境中,有類似下面所示的 段 進入執行緒同步 nnum 退出執行緒同步 以win32為例,如我們所知,執行緒同步工具有臨界區,互斥體,訊號量。我們可以任意選擇乙個,為了簡單很可能我們就選擇了臨界區。假如我們需要同步的 非常簡單,我非常建議不需要使用c 的任何功能。但是,很可能沒這...

裝箱與拆箱以及效能損失

先分析一下值型別與引用型別 值型別 int32 i 4 變數i是值型別,被分配在棧上,變數包含變數例項,使用效率高 引用型別 object o i 變數o是引用型別,被分配在託管堆,變數包含例項的指標,通過此指標引用其實例 引用型別效能要比值型別差很多,因此盡量使用值型別,而少使用引用型別。裝箱 1...