[英]Cost of message dispatch in Objective-C
我很想知道在各種情況下Objective-C中的消息發送成本。 特別是我想指導我選擇的程序設計,所以我不想通過避免消息發送來過早優化,因為它們可以實現更好的設計。
我當前項目中的一個案例是我有一個帶有實例變量的類:offsetX和offsetY。 我經常想要絕對偏移量,目前我在這個地方都有這行代碼: -
int absOffset = ((offsetX < 0.0) ? -offsetX : offsetX) +
((offsetY < 0.0) ? -offsetY : offsetY);
現在,如果這是C ++,我將創建一個返回absOffset值的內聯函數。 即使在Java / C#中,我也可以將這樣的函數定義為final / sealed,並且非常確定它將被內聯。
目標-C將是: -
-(int)absOffset {
return ((offsetX < 0.0) ? -offsetX : offsetX) +
((offsetY < 0.0) ? -offsetY : offsetY);
}
我會這樣稱呼它: -
int ao = [self absOffset];
現在,編譯器能夠內聯嗎? 我假設它至少能夠將它修復為直接函數調用並避免動態消息調度(我假設)objective-c必須使用因為它的類型系統。
另外,一般來說,客觀C中的消息調度成本是多少? 通過'id'調用指向具體類的指針時,它是否有所不同?
Objective C消息非常快。 速度與C ++虛擬方法調用相當,但速度不是很快。 避免消息傳遞絕對是不成熟的優化。 您可能不希望在內部循環中執行大量操作,但您選擇的算法和其他因素將對代碼的速度有更大的影響。 如果它太慢,請使用分析器並從那里開始。
首先,我將使用C函數fabs()。 對於其他一些簡單的內聯函數來說,小函數的輔助函數可以很好地工作。 使用方法而不是謹慎的行為可能是糟糕設計的標志。 性能甚至還沒有進入。
接下來,編譯器無法優化方法調用。 它是一種動態語言,直到運行時才調用該調用。 各種Objective-C技術可能會破壞編譯器的任何嘗試。
調用“id”上的方法與類型指針之間在運行時沒有區別 - 它們完全采用相同的機制。
最后,如果您在測量之前考慮性能特征,那么您已經過早地進行了優化。 這並不是說這種情況永遠不合適,因為有些人可能會相信,但它通常都適用。 在這種情況下,我認為,如果你把設計放在首位,你可能最終會得到一個足夠好的性能配置文件。 必要時,稍后進行測量和優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.