【问题标题】:Performance issues with NSMutableArray and NSArrayNSMutableArray 和 NSArray 的性能问题
【发布时间】:2010-02-12 16:28:36
【问题描述】:

我从事 C/C++ 编程已有 20 年,但我是 Objective-c 和 Coco 的新手,对 NSMutableArray 和 NSArray 的性能有一些疑问。

我需要一个类似于 stl list 容器的容器,但 coco 似乎没有,并且从 MSMutableArray 中间插入和删除元素似乎很慢,但将其视为 stl 向量也不是那么快。

此外,MSMutableArray 似乎只存储对象,因此跟踪简单的数据类型 line int 或 float 会导致创建对象来存储它们的额外开销。

我目前正在编写游戏,性能至关重要。对于我的游戏引擎,我总是可以投入到 C++ 中,但我喜欢 Objective-c 的东西太多了,我不想放弃它。

是否有我应该使用的用于 Objective-c 的快速 stl 容器?

有没有关于如何实现这些的好的在线文档,以便我可以尝试找出性能如此缓慢的原因?

谢谢!

【问题讨论】:

    标签: objective-c performance arrays nsmutablearray


    【解决方案1】:

    像 NSMutableArray 这样的基础集合类不能保证使用任何特定的实现,事实上我相信它们实际上会改变它们的数据结构来优化它们包含的项目数量的速度。你可以阅读更多here,但基本上我不会担心底层算法。

    您可以在 C 中创建自己的数据结构(如果您愿意,也可以使用 Objective-C++ 路线),这样可以节省将每个原语包装在 NSNumber 中的内存和性能开销。当然,您需要先运行性能工具,以确保这确实是问题所在,而且您不只是在浪费时间。

    【讨论】:

    • 链接已失效 :(
    【解决方案2】:

    如果您真的关心性能,我建议避免通过 Objective-C 使用 Foundation 数据结构,因为运行时系统消除了编译时优化的所有机会,并且正如您所说,您总是需要装箱原语。

    您可以只使用 Objective-C++ 并使用 std::list<id>

    如果您必须使用 Objective-C,请参阅 CHDataStructures,其中包含 CHSinglyLinkedList 类型。

    【讨论】:

      【解决方案3】:

      在真正的 ipad 设备上运行这个简单的两侧访问测试:

      NSMutableArray 与 float*,C 类型的 float* 快 109 倍!, 所以如果性能是一个问题,数字是很清楚的。

      -(void)testSpeedNSArrayvsFloat {
      const int n=1000000;
      NSMutableArray*a=[NSMutableArray arrayWithCapacity:n];
      
      NSTimeInterval tn, tf;
      NSDate *t=[NSDate date];
      for (int i=0; i<n; i++) {
          a[i]=[NSNumber numberWithFloat:i];
          float _f=[a[i] floatValue];
      }
      NSLog(@"%d nsarray number: %f",n, tn=-[t timeIntervalSinceNow]);
      
      t=[NSDate date];
      float*fa=calloc(n, sizeof(float));
      for (int i=0; i<n; i++) {
          fa[i]=i;
          float _f=fa[i];
      }
      
      NSLog(@"%d float number: %f",n, tf=-[t timeIntervalSinceNow]);
      NSLog(@"Ratio %f",tn/tf);
      free(fa);
      

      }

      2018-10-17 14:25:05.312866+0200 voiceXplorer[500:171209] 1000000 nsarray 编号:1.699707 2018-10-17 14:25:05.328571+0200 voiceXplorer[500:171209] 1000000 浮点数:0.015554 2018-10-17 14:25:05.328699+0200 voiceXplorer[500:171209] 比率 109.278151

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-05
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多