簡體   English   中英

Objective-C中的消息發送成本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM