13

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

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

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

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

一些警告:

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

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

4

1 回答 1

17

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

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,简单的 2.6.6 修复已针对这些问题实施了解决方法。可以观察到性能提高了 10 倍。

于 2011-06-01T23:44:20.480 回答