【问题标题】:Better performance with libxml2 or NSXMLParser on the iPhone?在 iPhone 上使用 libxml2 或 NSXMLParser 获得更好的性能?
【发布时间】:2009-05-05 18:28:30
【问题描述】:

我很好奇你在 iPhone 上的高性能 XML 解析解决方案是什么,因为它的 CPU 能力有限。我已经查看了 Apple 作为演示提供的 XML 性能应用程序,似乎对于他们正在解析的数据馈送(300 首 iTunes 歌曲).. libxml2 似乎总是成为最前沿的赢家。

根据您在处理小于 100Kb 的数据方面的经验,您更喜欢什么来获得最佳性能?我目前正在使用 TouchXML + libxml2 并查看是否可以按原样优化解析速度。

感谢您的反馈!

【问题讨论】:

  • 请记住,NSXMLParser 实际上是 libxml2 的 SAX 回调的包装器;因此,它几乎总是会在使用 libxml2 C API 解析相同的提要之上引入一些开销,尽管主要来自命名空间管理代码和为 xmlChar 元素和属性名称创建 NSStrings 时使用的分配/values 提供给其内部 SAX 回调。

标签: iphone objective-c xml cocoa-touch


【解决方案1】:

您可以随时查看我的 NSXMLParser 替代品。它从流中读取 XML 数据,而不是将其全部保存在内存中,并将其一次 1KB 传递到 libxml(NSXMLParser 一次性处理所有内容)。

源代码在on github 可用,我在内存方面的文章是on my blog

【讨论】:

    【解决方案2】:

    我通常发现对于较大的数据块(例如您引用的苹果示例),libxml2 往往更快。对于较小的数据块,差异可以忽略不计。我喜欢 NSXMLParser 的一个优点是它是基于 Objective-C 的 XML 解析器实现,其中 libxml2 是基于 C 的。

    【讨论】:

      【解决方案3】:

      出于多种原因,libxml2 总是比 NSXMLParser 更快,但是,这取决于您的项目。

      总体而言,NSXMLParser 更漂亮。代码是有意义的,因为 sax 解析器应该是,它是一个真正的 Cocoa 类,其中包含所有约定。如果方便和干净的代码是您的首要任务,那么您应该坚持使用 NSXMLParser。

      虽然 NSXMLParser 在后端使用 libxml2,但由于 Objective-C 的基础和 Objective-C 的致命弱点,它的速度较慢。在解析 XML 时,您实际上只是在搜索您感兴趣的标签时一遍又一遍地做一堆紧密的循环。

      这就是教训——当在 Objective C 中的一个紧密循环中你无法使用快速对象枚举时,你正在寻找一个严重的性能损失。 Dispatch / Delegate respondsToSelector / 和其他 Objective C 基础语言结构在这里给你一个真正的劣势。

      我不打算进行调度,但关键是,每当您访问类似这样的内容时:“[zomg lolz]”,您就是在将方法签名传递给 Objective-c 调度程序以查找目标 C -function 用于您的 Objective-C 方法签名。如果一遍又一遍地执行此查找过程,可能会大大降低您的性能。

      如果您使用的是 iPhone,请使用 libxml2 并且不要回头看 - 但是如果您的目标机器有两个处理器并且内存比上帝还多,我会使用 NSXMLParser 以便于维护代码。

      【讨论】:

        【解决方案4】:

        我使用苹果提供的 XML 解析应用程序尝试了我的数据(大约 600 条记录)。发现 libxml2 比 NSXMLParser 快得多。我切换到 libxml2(虽然我发现它的实现比 NSXMLParser 更复杂,但它很适合我的目的)

        用大约 100 条记录尝试的相同示例在两种实现中没有太大差异。

        【讨论】:

          【解决方案5】:

          libxml2 总是比 NSXMLParser 快。 NSXMLParser 为您提供了一个不错的基于事件的 API,但它建立在 libxml2 之上,并且也不是基于流的(例如,NSXMLParser 一次将整个数据块交给 libxml2)。

          如果您正在优化速度,那么 libxml2 绝对是您的最佳选择。但是,如果您想要一个基于 obj-c 事件的 API 并且不太关心性能,那么 NSXMLParser 是适合这项工作的工具。请注意,NSXMLParser 不一定慢,只是不如 libxml2 快。

          【讨论】:

            【解决方案6】:

            如果您想在 Objective-C 前端使用 libxml2,请查看这组有用的 wrapper functions

            您向 XML 文档对象发出 Xpath 查询并返回 Foundation 类对象:NSArrayNSStringNSDictionary

            这些函数有助于将 libxml2 的速度与 Objective-C 代码的可读性结合起来。

            【讨论】:

              【解决方案7】:

              libxml2 比 NSXMLParser 更快,也更灵活。它还与 iPhone OS 2.2.1 发布的 SDK 中的 xmlReader 接口(我最喜欢的接口)有一个非常小的(但值得注意的)内存泄漏。 http://inessential.com/2009/02/25/moving_to_libxml2_sax2 中嵌入的详细信息。 libxml2 中的其他接口没有这个问题 - 我最喜欢的接口就是这样。

              从功能上讲,相对少量的 XML,您不会注意到差异,但如果您发现自己在大量流式传输到解析器中时遇到了麻烦,它会变得很明显。

              正如 zPesk 提到的,对于少量数据,您可能会发现直接使用 Objective-C 的好处比您获得的少量性能更有益。

              【讨论】:

                【解决方案8】:

                我使用过 Objective-Xml。这是 NSXMLParser 的另一个替代品。它给了我大约 15 秒的改进,而该文件需要 1 分钟多的时间来解析。不过还是太慢了。

                【讨论】:

                  猜你喜欢
                  • 2011-11-29
                  • 2021-02-05
                  • 2017-08-29
                  • 2010-09-18
                  • 1970-01-01
                  • 2011-05-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-07-18
                  相关资源
                  最近更新 更多