【发布时间】:2010-11-06 14:14:39
【问题描述】:
为了培养良好的编程习惯,提高我的代码效率(阅读:“我哥和我在争论一些代码”),我向有经验的程序员提出这个问题:
哪个代码块“更好”? 对于那些懒得阅读代码的人来说,是否值得在 for 循环中放置一个条件来减少冗余代码的数量,而不是把它放在外面并制作 2 个 for 循环?两段代码都有效,问题是效率与可读性。
- (NSInteger)eliminateGroup {
NSMutableArray *blocksToKill = [[NSMutableArray arrayWithCapacity:rowCapacity*rowCapacity] retain];
NSInteger numOfBlocks = (NSInteger)[self countChargeOfGroup:blocksToKill];
Block *temp;
NSInteger chargeTotal = 0;
//Start paying attention here
if (numOfBlocks > 3)
for (NSUInteger i = 0; i < [blocksToKill count]; i++) {
temp = (Block *)[blocksToKill objectAtIndex:i];
chargeTotal += temp.charge;
[temp eliminate];
temp.beenCounted = NO;
}
}
else {
for (NSUInteger i = 0; i < [blocksToKill count]; i++) {
temp = (Block *)[blocksToKill objectAtIndex:i];
temp.beenCounted = NO;
}
}
[blocksToKill release];
return chargeTotal;
}
或者……
- (NSInteger)eliminateGroup {
NSMutableArray *blocksToKill = [[NSMutableArray arrayWithCapacity:rowCapacity*rowCapacity] retain];
NSInteger numOfBlocks = (NSInteger)[self countChargeOfGroup:blocksToKill];
Block *temp;
NSInteger chargeTotal = 0;
//Start paying attention here
for (NSUInteger i = 0; i < [blocksToKill count]; i++) {
temp = (Block *)[blocksToKill objectAtIndex:i];
if (numOfBlocks > 3) {
chargeTotal += temp.charge;
[temp eliminate];
}
temp.beenCounted = NO;
}
[blocksToKill release];
return chargeTotal;
}
请记住,这是针对游戏的。只要用户双击屏幕,就会调用该方法,并且 for 循环通常运行 1 到 15 次迭代,最多 64 次。我知道这真的没那么重要,这主要是为了帮助我准确了解条件语句的成本。 (阅读:我只是想知道我是否正确。)
【问题讨论】:
-
首先,这两个示例都可以从 for-in 循环中受益 - 请参阅下面的 Peter Lewis 示例,并在您在那里时对其进行投票。为了清楚起见,我建议他改编第二种形式。引用 Donald Knuth 的话,“过早的优化是万恶之源。”
-
已经投了赞成票!我对大多数提供新思考的答案投了赞成票。它们绝对值得一读,尽管我个人认为 R. Pate 值得一读。
标签: objective-c iphone performance for-loop conditional