我有一个应用程序遍历数组的每一步,当数组为空时,我似乎得到令人惊讶的慢结果。所以,我调查了一些后续测试,如下所示: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