【问题标题】:which technique will be very speed among these three techniques? [duplicate]在这三种技术中,哪种技术会非常快速? [复制]
【发布时间】:2013-10-07 10:33:39
【问题描述】:
NSEnumerator* friendsEnumerator = [friends objectEnumerator];

id aFriend;

while ((aFriend = [friendsEnumerator nextObject])) {

  printf("%s\n", [aFriend UTF8String]);

}


int friendsCount = [friends count];

for(int i = 0; i < friendsCount; i++) {

  printf("%s\n", [[friends objectAtIndex: i] UTF8String]);

}


for(NSString* aFriend in friends) {

  printf("%s\n", [aFriend UTF8String]);

}

【问题讨论】:

  • 1和3不是一回事吗?我认为您需要对其进行分析才能找到答案。
  • 在循环内记录会减慢它的速度,以至于它们之间的差异将非常微不足道......
  • 如果您想检查性能,请务必进行测量。如果你问别人,他们会根据他们的知识或经验给你答案,但这不必对你的代码是可重现的,尤其是在这种情况下,人们只会认为他们知道正确的答案。

标签: iphone ios objective-c


【解决方案1】:

您也可以使用以下方法枚举数组。stop 参数对性能很重要,因为它允许枚举根据块内确定的某些条件提前停止。

[friends enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop){

 if ('some condition') {
      NSLog(@"Object Found: %@ at index: %i",obj, index);
      *stop = YES;
 }

} ];

【讨论】:

    【解决方案2】:

    首先:选项 1 和 3 在操作方面是相同的,都使用 NSFastEnumeration 协议来提供对集合中对象的快速访问。

    正如名称“NSFastEnumeration”所暗示的那样,枚举比 for 循环更快,因为它们不需要检查每个对象的数组边界。

    所以归结为 1 到 3 之间的品味问题。我个人更喜欢 forin 循环,因为它们似乎更优雅。

    【讨论】:

    • [arrayName enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { }];这种使用块的枚举呢?它比案例 3 更快吗?
    • 对不起,在我链接的苹果编程指南中明确指出The enumeration is more efficient than using NSEnumerator directly.时它们有何相同之处?
    • 感谢 jens..您的黄金反馈..
    【解决方案3】:

    案例 3 是最快且通常更好的方法:

    快速枚举是枚举集合内容的首选方法,因为它提供以下好处:

    • 枚举比直接使用 NSEnumerator 更有效。
      • 列表项
      • 语法简洁。
      • 如果在枚举时修改集合,枚举器会引发异常。 您可以同时执行多个枚举。

    您可以阅读更多关于它的信息here

    【讨论】:

    • [arrayName enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { }];
    • 这种类型的枚举怎么样..它比案例3更快吗?
    • 谢谢micantox..我只能增加一分..如果有更多的选择,那么我会做更多..更多..非常感谢...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2011-12-26
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多