我有一個應用程序遍歷數組的每一步,當數組爲空時,我似乎得到令人驚訝的慢結果。所以,我調查了一些後續測試,如下所示:Objective-C空陣列性能
NSMutableArray* ar = [NSMutableArray array];
double time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 10000; i++)
{
for (NSObject* obj in ar)
{
[obj retain];
[obj release];
}
}
time = CFAbsoluteTimeGetCurrent() - time;
printf("Empty Time: %1.12f", time/10000.0f);
time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < 10000; i++)
{
if ([ar count] > 0)
{
for (NSObject* obj in ar)
{
[obj retain];
[obj release];
}
}
}
time = CFAbsoluteTimeGetCurrent() - time;
printf("Checked Time: %1.12f", time/10000.0f);
我試過100次| 1,000 |萬個迭代週期,結果如下:
Empty Time: 0.000000039935 //100
Checked Time: 0.000000020266 //100
Empty Time: 0.000000018001 //1000
Checked Time: 0.000000011027 //1000
Empty Time: 0.000000015503 //10000
Checked Time: 0.000000008899 //10000
奇怪的是,這表明具有簡單地計算檢查顯著提高了低迭代運行性能(可能是因爲緩存方案)。這對我來說是絕對令人驚訝的,因爲我期望Objective-C編譯/運行時已經在執行foreach循環時執行此檢查!有沒有人有任何想法,爲什麼這可能是這種情況,如果有什麼辦法來擠出更多的性能出這個循環設置?謝謝!
HOLY POO!該塊的實現將執行時間縮短了100倍!它必須使用GCD來表現這種表現,是的?這非常不可思議,我將不得不考慮這一點。謝謝!哦,是的,我正在構建一個遊戲,所以遍歷空數組會發生在每一幀,因此空數組的性能非常重要。幸運的是,計數檢查沒有我想象的那麼糟糕(例如20行鍋爐代碼)。再次感謝! – Grimless 2010-10-24 20:48:11
奇怪。我試過你的塊實現,它實際上使執行時間增加了三倍!這是我得到的:檢查時間:\t 0。000000009954空時間:\t \t 0.000000016987塊時間:\t \t 0.000000037014。注意:這已經完成了1000次,所以有可能塊創建實際上是造成這種情況的原因。編輯:是的,所以我擺脫了fori循環,並試圖直接塊運行,它減少了2倍的運行時間。好的解決方案 – Grimless 2010-10-24 20:56:35
OOPS!忘了調整其他循環。是的,所以該塊的實施將運行時間增加了3倍......哎喲。 – Grimless 2010-10-24 21:02:32