SimpleXML库与XML在Android上的性能表现

13
我正在使用 Simple XML 库 处理 Android 应用中的XML文件。这些文件可能会相当大 - 大约1MB,并且可以非常深度嵌套,因此它们相当复杂。
当应用程序通过 Simple API 加载其中一个文件时,可能需要最多30秒才能完成。目前,我将 FileInputStream 传递到 Simple 的 Persister 类的 [read(Class, InputStream)][2] 方法中。实际上,它只是读取XML节点并将数据映射到我的模型对象的实例中,在内存中复制XML树结构。
那么我的问题是如何在Android上提高性能?我目前的想法是将文件内容读入字节数组中,并将 ByteArrayInputStream 传递给 Persister 的读取方法。我想处理文件的时间会更快,但我不确定节省的时间是否会被先读取整个文件所需的时间所抵消。另外,内存限制可能是一个问题。
这是愚蠢的事情吗?在这种情况下,还有其他任何事情可以增加性能吗?如果没有,我只能改进向用户反馈文件加载进度的方式。
一些注意事项:
1)我不能更改正在使用的XML库 - 相关代码是跨桌面、移动和Web应用程序使用的“引擎”部分。目前修改它的开销太大。
2)数据文件由用户创建,因此我无法控制其大小/嵌套深度。

1
哇,听起来好像需要很长时间。我使用简单的XML库,没有遇到这样大的减速。你提出的第二点很奇怪,但我必须说,1MB确实是一个很大的XML文件。我的整个WordPress博客的导出都比那小,所以我不惊讶它需要这么长时间。如果我是你,我会在Simple SourceForge页面上报告一个错误:http://sourceforge.net/tracker/?group_id=112203&atid=661526 - Robert Massaioli
1个回答

17

嗯,有很多事情可以做来提高性能。以下是具体方法:

1) 在Android上,您应该至少使用2.5.2版本,但最好使用2.5.3版本,因为它使用了KXML,这在Android上更快且更节省内存。

2) Simple将动态构建对象图,这意味着它需要加载尚未加载的类,并基于其注释使用反射为每个类构建模式。因此第一次使用始终是最昂贵的。重复使用相同的持久化器实例将快得多。因此,尽可能避免多个持久化器实例,如果可能,请仅使用一个。

3) 尝试测量直接读取文件所需的时间,而不使用Simple XML库。需要多长时间?如果需要很长时间,则知道这里的性能影响是由于文件系统。尝试使用BufferedInputStream以提高性能。

4) 如果仍然注意到任何问题,请在邮件列表中提出。

编辑: Android存在注释处理问题https://code.google.com/p/android/issues/detail?id=7811,Simple 2.6.6修复了这些问题并实现了解决方案。可以观察到10倍的性能提高。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接