带有 SimpleXML 库的 XML - Android 上的性能

Posted

技术标签:

【中文标题】带有 SimpleXML 库的 XML - Android 上的性能【英文标题】:XML With SimpleXML Library - Performance on Android 【发布时间】:2011-08-29 18:46:48 【问题描述】:

我正在使用Simple XML library 在我的 android 应用程序中处理 XML 文件。这些文件可能会变得非常大 - 大约 1Mb,并且可以嵌套非常深,因此它们相当复杂。

当应用通过 Simple API 加载其中一个文件时,最多可能需要 30 秒才能完成。目前我将 FileInputStream 传递给 Simple 的 Persister 类的 [read(Class, InputStream)][2] 方法。实际上,它只是读取 XML 节点并将数据映射到我的模型对象的实例,复制内存中的 XML 树结构。

那么我的问题是如何提高 Android 的性能?我目前的想法是将文件的内容读入字节数组,然后将 ByteArrayInputStream 传递给 Persister 的 read 方法。我想处理文件的时间会更快,但我不确定节省的时间是否会被首先读取整个文件所花费的时间抵消。内存限制也可能是一个问题。

这是愚蠢的差事吗?在这种情况下,我还能做些什么来提高性能吗?如果没有,我将不得不求助于改进对用户的加载文件进度的反馈。

一些注意事项:

1) 我无法更改我正在使用的 XML 库 - 有问题的代码是跨桌面、移动和 Web 应用程序使用的“引擎”的一部分。暂时改变它的开销太大了。

2) 数据文件由用户创建,因此我无法控制其中嵌套的大小/深度。

【问题讨论】:

哇,这听起来很长。我使用简单 XML 库,我没有经历过这么大的减速。您提出的第二点很奇怪,但我必须说 1MB 确实是一个大型 XML 文件。我的整个 Wordpress 博客的整个导出量都比这要少,所以我对它需要这么长时间并不感到惊讶。如果我是你,我会在简单的 sourceforge 页面中让它成为一个错误:sourceforge.net/tracker/?group_id=112203&atid=661526 【参考方案1】:

嗯,您可以做很多事情来改善这一点。他们来了。

1) 在 Android 上,您应该至少使用 2.5.2 版本,但最好是 2.5.3,因为它使用 KXML,这在 Android 上速度更快,内存效率更高。

2) Simple 将动态构建您的对象图,这意味着它将需要加载尚未加载的类,并使用反射基于其注释为每个类构建一个模式。所以第一次使用永远是迄今为止最昂贵的。重复使用同一个持久化实例会快很多倍。所以尽量避免使用多个持久化实例,尽可能只使用一个。

3) 尝试测量直接读取文件所花费的时间,而不使用简单 XML 库。多久时间?如果它需要很长时间,那么您知道这里的性能下降是由于文件系统造成的。尝试使用 BufferedInputStream 来提高性能。

4) 如果您仍然发现任何问题,请在邮件列表中提出。

编辑: Android 在注释处理https://code.google.com/p/android/issues/detail?id=7811 方面存在一些问题,Simple 2.6.6 修复已针对这些问题实施了解决方法。可以观察到性能提升了 10 倍。

【讨论】:

你的评论“重复使用同一个持久化实例会快很多倍。所以尽量避免使用多个持久化实例,如果可能的话只使用一个。”在 API 调用中为我们节省了大量时间。在我优化之前,它过去需要 15 秒,现在需要 3-5 秒。谢谢。 我正在解析大量 2.7.1 版本的 XML 流,每个大小约为 1k。重用持久化器而不是重新创建它,将低端智能手机上约 350 个流的解析时间从 3 分钟减少到 14 秒。

以上是关于带有 SimpleXML 库的 XML - Android 上的性能的主要内容,如果未能解决你的问题,请参考以下文章

PHP SimpleXML 不保留 XML 属性中的换行符

xml查找节点父节点并删除simplexml php

SimpleXML @ElementList注解移除class属性

使用simplexml处理xml文件的Tips

使用 SimpleXML 从头开始​​创建 XML 对象

xml 元素中的属性不在 simplexml 数组中