我已经为iPhone开发了很长一段时间,我一直在想是否有任何数组对象在Obj-C中使用循环缓冲区?像Java的堆栈或列表或队列。 我一直在修补NSMutableArray,测试它的限制......似乎在数组中的50k个简单对象之后 - 应用程序显着减慢了。
那么,除了NSMutableArray(大量数据变得非常慢)之外,还有更好的解决方案吗?如果没有,任何人都可以告诉我有关创建这样一个对象的方法(会涉及使用链(节点)对象??)。
底线:直接从SQLite DB填充UITableView会很聪明吗?因为它不需要来自数组或任何内容的内存,而只需要查询。 SQLite速度快,而不是内存磨削。
非常感谢您的时间和关注, 〜纳塔纳瓦拉。
从我一直以来的观点来看,Quinn的课程似乎是最好的选择。 我有另一个问题 - 从SQLite DB直接加载所有内容而不是创建一个对象并将其推入一个数组会更快还是更聪明?
提前谢谢你, 〜纳塔纳瓦拉。
答案 0 :(得分:8)
为我自己的号角做了道歉,但我在CHDataStructures中实现了一个基于C的循环缓冲区。 (具体来说,请查看CHCircularBufferQueue
和CHCircularBufferStack
。)该项目是开源的,并且具有基准测试,证明与一般情况下的NSMutableArray相比,真正的循环缓冲区非常快,但结果将取决于您的数据和使用情况,以及您在内存受限设备(例如iPhone)上运行的事实。希望有所帮助!
答案 1 :(得分:4)
如果您发现性能问题,请衡量应用花费时间的位置,不要只是猜测。 Apple提供了一套出色的性能测量工具。
答案 2 :(得分:1)
使用各种insertObject:atIndex:
和removeObjectAtIndex:
方法让NSMutable数组像堆栈,列表,队列等一样是微不足道的。如果要硬连接行为,可以编写自己的子类。
我怀疑你看到的性能问题是由NSMutableArray
引起的,特别是如果你的参考点是那么慢的Java。问题很可能是iPhone本身。如前所述,在这种情况下,50,000个objective-c对象并不是一个微不足道的数据,iPhone硬件可能很难管理这么多数据。
如果您需要某种高性能的字节数组,您可以使用其中一个核心基础数组,或者在纯C中滚动自己的数组,然后将它们包装在自定义类中。
听起来我需要切换到核心数据,因此您不必将所有这些都保留在内存中。核心数据只有在您需要时才能有效地获取您想要的内容。
答案 3 :(得分:0)
您可以在“Objective-C ++”中使用STL类 - 这是使用C ++类的Objective-C的一个奇特名称。只需将那些使用C ++代码的源文件命名为“.mm”扩展名,您就可以获得混合运行时。
答案 4 :(得分:-3)
Objective-C对象实际上并不“简单”,因此其中50,000个对象非常苛刻。如果要避免Objective-C运行时的瓶颈和资源需求,请用直接C或C ++编写自己的代码。
与便利性相关的开销相当冗长且非理论性的讨论:
http://www.cocoabuilder.com/archive/cocoa/35145-nsarray-overhead-question.html#35128
简单的人的简单数学:
创建一个对象而不是结构所需的只是一个开头的单个指针。
让我们说这是真的,假设我们在一个带有4个字节指针的32位系统上运行。
4个字节x 50,000个对象= 200000个字节
因为你使用的是Objective-C,所以你的数据突然需要这几乎是200MB的额外内存。现在,无论NSArray将这些对象添加到这一事实,都会将其自身的两倍增加,因为它保留了自己指向这些对象的指针,而你刚刚咀嚼了400MB的RAM就可以了使用几个便利包装。
在这里刷新我的内存......硬盘上的交换文件和RAM一样快吗? iPhone中有多少RAM?向对象发送消息需要多少函数调用和堆栈帧?为什么IOKit不是用Objective-C编写的?有多少Apple使用AppKit做大量DSP的旗舰应用程序?有人拿到了他们可以查询的otool副本吗?我在这里看到零。