【问题标题】:iphone large NSArray of strings performance woesiphone大的NSArray字符串性能问题
【发布时间】:2010-02-05 05:16:01
【问题描述】:

我有一个 Iphone 应用程序,其中包含大量嵌套的 NSArray 字符串。 NSArray 有 3 层深,最深的层总共有大约 15,000 个字符串。绝大多数字符串少于 20 个字符。每隔一段时间,我的应用就会挂起一段时间,然后在 5-25 秒左右后恢复工作。这显然是不可接受的。如果我只使用 2,000 个字符串运行应用程序,挂起就会变得更加罕见。所以我很确定大型 NSArray 会导致问题。

哪种替代数据结构可能会更好地工作?我所需要的只是在应用程序启动时从文件中快速读取数组,然后能够从数组中随机访问字符串。 [实际上比这复杂一点;我需要能够从数组的预定子集中抓取随机字符串。] 该程序可能每秒抓取一次随机字符串。

顺便说一句,NSArray 当前存储在单例类中。

【问题讨论】:

  • 您应该调查导致挂断的原因。您如何要求这些物品?没有理由直接索引 (objectAtIndex:) 三次会导致 20 秒的等待。
  • 我的部分问题是我并不真正了解这些工具。我使用 Shark 进行了分析,它说 PID#0 正在使用我 90+% 的 CPU。但我不知道 PID#0 是什么。

标签: iphone performance nsarray


【解决方案1】:

有这么多字符串,你不可能一次把它们放在一个表中(对吗???)。

您真的非常需要将它们放入数据库并按需访问它们。 Core Data 专为持久化大型对象图而量身定制,可让您快速提取您关心的部分,同时为您在幕后缓存内容。

至于仪器,您确实希望使用 Time Profiler 来查看系统将所有时间都花在哪里 - 最好是在设备本身上。例如,您可能会发现在自动释放对象上花费了大量时间(长时间的随机停顿似乎是一种迹象)——这对应于不断摆脱大部分数组。

【讨论】:

  • 我不确定您所说的“在桌子上”是什么意思。它们位于加载到内存中的 NSArray 中。你是说这可能是我的问题吗?
  • 我确定这是您的问题,或者至少这不是一个好主意——“在表格中”我的意思是实际上所有内容都在一个 UITable 中一次显示给用户。这对我来说似乎不太可能,向用户展示一个包含 10k 个条目的表格以进行滚动。鉴于您不会一次将它们全部显示出来,将它们保存在数据库中会更有意义。
  • 这仅占大约 350KB 的存储空间,因此这么多内存本身似乎并不疯狂。我认为这取决于你用它做什么。
  • 与其说是存储量,不如说是对象的数量,其中分配和释放大量微小的内存块会影响性能。如果大小是恒定的,您可能会考虑使用 NSMutableArrays 并通过跟踪未使用的数组池来重新使用它们而不是释放它们。
【解决方案2】:

虽然确实会想到其他数据结构 (trie),但真正的问题是:

(1) 在这些挂起期间,您是否或可以使用 Instruments 进行分析

并且假设数组是您的问题,但不一定正确

(2) 你对数组执行了哪些操作?

您不想猜测导致性能问题的原因,除非您别无选择,您想要衡量。但如果你让我猜……我想知道你的内存是否紧张,挂起是否是系统发出低内存警告和清理的东西。

【讨论】:

  • 我知道我没有泄漏。对象分配最高可达每分钟 10MB。除此之外——仪器的哪些部分可能会给我有用的信息?
  • 时间分析器。它挂起时在做什么?
  • 我不知道,因为尽我所能,我无法让时间分析器来分析我的 Ipod touch。它始终是灰色的。我确实在鲨鱼下对其进行了分析,它是 90%+ PID#0。但我也不知道 PID#0 是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多