2012-02-19 41 views
2

我可以定義一個具有屬性的類來從課堂外訪問我的ivars。是否可以使用課堂外的直接ivar訪問來提高效率?

我也可以使用myInst-> ivar語法以C結構方式訪問。

在C++中,我將使用訪問器,但是在objective-c中,有些情況下我可能需要直接訪問。消息傳遞系統會在訪問器的性能方面產生很大的影響,這在某些情況下很重要,因爲消息不像使用C++方法那樣內聯。

例如在一個具有名爲標量和其上定義的屬性的類的實例中。標是一個簡單的浮點值:

-(void) doWorkWithMyClass:(MyClass*)myinst 
{ 
    // array and other locals declaration omitted 
    for (int i = 0; i < reallyBigX; i++) { 
     result += [myinst scalar] * array[i]; 
     [myinst computeNextScalar:i]; 
    } 
} 

如果我改變[MYINST標]到myinst->標量,該方法將運行速度快了很多,因爲使用電話與訪問會佔用在這最CPU的循環。

與C++一樣,我明白直接ivar訪問一般是不鼓勵的,但在這種情況下,速度問題時,它可以接受嗎?如果沒有,是否還有一種更優先的方法仍然使用Objective-C類?

+1

通常您會直接在C或C++中執行性能密集型部件。 – 2012-02-19 23:44:46

+1

您使用訪問器時看到的性能影響有多大?你是否已經量化了「巨大的性能打擊」以及直接訪問伊娃的速度要快多少,還是這種先發制人的假設? – 2012-02-20 00:03:50

+0

@GeorgFritzsche是的,我通常這樣做,但是當我想要在一個類接口中進行多態性,NSCoding和引用計數時彈出,而不是將它分解爲structs/C++類和obj-c類。 – 2012-02-20 00:04:12

回答

6

當它對性能有重大影響時,許多事情都可以接受,但在您提供的示例中,似乎有更好的解決方案。

首先,爲什麼[myinst computeNextScalar:i]返回新的標量?如果你這樣做了,你就不需要取它,一切都會更快。

不能將作品轉移到myinst嗎?我的意思是,你不能創造這樣的:

result = [myinst totalOverArray:array]; 

如果reallyBigX是非常大的,那麼你應該在這裏考慮Accelerate.framework。它可以顯着提高您所做的操作的性能。 (您必須使用Accelerate框架進行性能測試,但對於某些操作可能會明顯較慢,但這可能會更快)。

最後,考慮Objective-C get...模式。它看起來像這樣:

int *scalars = calloc(reallyBigX, sizeof(int)); 
[myinst getScalars:scalars range:NSMakeRange(0, reallyBigX)]; 
for (int i = 0; i < reallyBigX; i++) { 
    result += scalars[i] * array[i]; 
} 
free(scalars); 

BTW,上面絕對是vDSP_dotpr()候選人,但應性能測試。在很多情況下,當stride = 1時(因爲您可以使用簡單的增量而不是+= stride),簡單循環比等效的vDSP調用要快。

+1

這些都是偉大的消費,謝謝。因此,如果您打算使用obj-c來處理這種事情,請參閱第一種方法是否可以將消息傳遞瓶頸分解爲更長的塊。其他優化技術聽起來也很有趣。 – 2012-02-20 01:05:21

+0

「因此,如果你打算使用obj-c來處理這種事情,那麼看看你是否可以將消息傳遞瓶頸分解爲更長的塊作爲第一種方法。」 - 確實如此。 – 2012-02-20 01:22:32

+0

正如我試圖使用的移動功能到數組(totalOverArray)我意識到這不適用於我的情況,因爲doWorkWithMyClass是polymorphed和行爲因每個類而異。所以我會使用getScalars方法。 – 2012-02-20 02:17:03

1

是的,它是可以接受的:@public@private等等部分引入了訪問修飾符來支持需要從類外部訪問ivars的設計。不過,你應該避免直接寫入ivars。

相關問題