XML with SimpleXML Library - Android 上的 Performance

我正在使用 Simple XML 库来处理 Android 应用程序中的 XML 文件。这些文件可以变得相当大 - 大约1Mb,并且可以嵌套得很深,所以它们相当复杂。

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

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

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

一些注意事项:

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

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


答案 1

好吧,你可以做很多事情来改善这一点。他们来了。

1)在Android上,您应该至少使用2.5.2版本,但理想情况下是2.5.3,因为它使用KXML,这在Android上更快,内存效率更高。

2)Simple将动态构建您的对象图,这意味着它将需要加载尚未加载的类,并使用反射基于其注释为每个类构建架构。因此,首次使用始终是迄今为止最昂贵的。重复使用相同的持久化实例将快许多倍。因此,尽量避免使用多个持久化实例,如果可能,只需使用一个实例。

3) 尝试测量直接读取文件所花费的时间,而不使用简单 XML 库。需要多长时间?如果它需要永远,那么您知道这里的性能损失是由于文件系统造成的。尝试使用缓冲输入流来提高性能。

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

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


答案 2

推荐