Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML与SimpleXML库-Android上的性能_Java_Android_Xml_Xml Deserialization_Simple Framework - Fatal编程技术网

Java XML与SimpleXML库-Android上的性能

Java XML与SimpleXML库-Android上的性能,java,android,xml,xml-deserialization,simple-framework,Java,Android,Xml,Xml Deserialization,Simple Framework,我正在使用来处理Android应用程序中的XML文件。这些文件可能会非常大,大约1Mb,并且嵌套得非常深,所以它们相当复杂 当应用程序通过简单API加载其中一个文件时,可能需要30秒才能完成。目前,我正在将一个FileInputStream传递到Simple的Persister类的[read(Class,InputStream)][2]方法中。实际上,它只是读取XML节点并将数据映射到模型对象的实例,从而在内存中复制XML树结构 那么,我的问题是如何在Android上提高性能?我目前的想法是将文

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

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

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

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

一些警告:

1) 我无法更改我正在使用的XML库-所讨论的代码是“引擎”的一部分,该引擎用于桌面、移动和web应用程序。目前改变它的开销太大了


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

好吧,您可以做很多事情来改进这一点。给你

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

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

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

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

编辑:
Android在注释处理方面存在一些问题,Simple 2.6.6修复程序已经针对这些问题实施了解决方案。性能提高了10倍。

哇,听起来好像时间太长了。我使用简单的XML库,我没有经历过如此大的减速。您提出的第二点很奇怪,但我必须说1MB确实是一个很大的XML文件。我整个Wordpress博客的输出量都比这少,所以我对它花费这么长时间并不感到惊讶。如果我是你,我会在simple sourceforge页面上把它变成一个bug:你的评论“重复使用同一个persister实例会快很多倍。所以尽量避免使用多个persister实例,如果可能的话只使用一个。”为我们节省了大量API调用时间。在我优化这个之前,它过去需要15秒,现在需要3-5秒。谢谢。我正在解析大量2.7.1版的XML流,每个流的大小约为1k。重用持久化程序而不是重新创建它将低端智能手机上约350个流的解析时间从3分钟减少到14秒。