2009-12-04 53 views
2

我正在研究一個應用程序,我有一個存儲20個左右精靈的NSMutableArray。我需要相當快速和高效地遍歷它。我的目的速度並不是最優的......我在迭代時從每個精靈中獲得兩個值,它是否更有效(更快)地遍歷CGPoints數組,然後是一組精靈?或者,爲了僅處理兩個整數值的唯一目的,而不是CGPoint創建一個自定義類。無論哪種方式,速度都受存儲在數組中的對象類型或值的影響?Objective-C數組迭代速度

+1

第一個人資料,看看那裏的性能問題,然後優化熱點。 – 2009-12-05 02:18:07

回答

8

我不認爲你應該擔心只有20個項目的迭代速度。

+0

同意。不要爲此感到擔心,除非n可能是任意大的,如果你正在迭代一個LOT,或者它有一天會比20大得多。如果肯定會達到20,那麼尋找其他地方來指導你的優化努力。 – 2009-12-04 22:17:00

+0

看到我通常不會正常工作,但我正在開發一款遊戲,而這種迭代遍歷數組的方法每秒鐘會被調用大約2次。所以速度變化正在被遊戲的響應時間所吸收,這並不是很明顯,但仍有一些可能會被它所困擾。我做了一個CG數組的C數組,並注意到一個改進...雖然感謝您的幫助。 – BTN 2009-12-04 22:38:21

8

迭代的速度不受存儲在數組中的數據類型的影響。它受您使用的數組類型影響:在遍歷Objective-C NSArray(或其任何子類,如NSMutableArray),C風格數組或C++ std::vector之間存在顯着差異。

如果您使用的是NSArray,並且您正在使用Objective-C 2.0(例如,在iPhone或Mac OS X 10.5或更高版本中),則可以使用fast enumeration進行迭代,這比舊版本快得多迭代的風格:

// Fast enumeration 
for(id object in myNSArray) 
    ; // do stuff with object 

// Slow enumeration 
int count = [myNSArray count], i; 
for(i = 0; i < count; i++) 
{ 
    id object = [myNSArray objectAtIndex:i]; 
    // do stuff with object 
} 

我不知道枚舉的速度有多快與C風格的數組或C++ std::vector小號比較,但我敢打賭,它仍然是一個稍微慢一點。速度較慢,因爲你有額外的Objective-C開銷:傳遞消息(例如countobjectAtIndex:)通過Objective-C運行時,即使在最好的情況下,它也比裸指針運算慢。

遍歷通過C風格的數組或C++ std::vector是非常快的,因爲編譯器能夠優化他們真的沒有開銷簡單的指針算術指令:

// C-style array 
SomeType *myArray = ...; // e.g. malloc(myArraySize * sizeof(SomeType)) 
int i; 
for(i = 0; i < myArraySize; i++) 
    ; // do stuff with myArray[i] 

// C++ vector 
std::vector<SomeType> myArray = ...; 
for(std::vector<SomeType>::iterator i = myArray.begin(); i != myArray.end(); ++i) 
    ; // do stuff with *i 
+0

那麼也許我的答案會是CGPoint的C數組? – BTN 2009-12-04 22:33:17

+0

謝謝你的幫助。 – BTN 2009-12-04 22:40:06

+0

快速枚舉真的比在obj-c中做循環的舊方式更快嗎?這不僅僅是語法糖對於同樣的事情嗎? – dbachrach 2009-12-05 00:01:58