安卓:Gson 性能

14

我正在尝试在Android模拟器上使用Gson进行对象映射。

当处理大约208 kb的JSON数据时,速度非常缓慢。我的JSON中没有层次结构。

对象映射完成后,我可以看到Gson创建了大约500条记录。

在Android模拟器上,将输入的JSON映射需要超过3分钟。

我的实体已经被注释,包括字符串和几个浮点数。

我错过了什么吗?

有任何想法、最佳实践都会极大地帮助。

是否有任何快速对象映射JSON数据的方法?

        URL myURL = new URL(url);
        /* Open a connection to that URL. */
        URLConnection ucon = myURL.openConnection();
        /*
         * Define InputStreams to read from the URLConnection.
         */
        InputStream is = ucon.getInputStream();
        InputStreamReader reader = new InputStreamReader(is);
        long tickCount = System.currentTimeMillis();
        Policy[] policies = new Gson().fromJson(reader, Policy[].class);
        long endCount = System.currentTimeMillis() - tickCount;
        Log.d("Time to pull policies in milliseconds", "" + endCount);

请勿使用Android模拟器进行性能测量。其性能模型与真实设备显著不同。 - Jesse Wilson
5个回答

5

4

您尝试过将GSON流解析器与Gson对象混合使用吗?http://sites.google.com/site/gson/streaming(查找Mixed read示例)。

这种方法可能有所帮助,因为Gson会读入整个解析树,然后对其进行操作。对于一个大的数组列表,读取所有元素并尝试解析可能会导致大量的内存交换(或抖动)。这种方法将逐个读取每个元素。

希望这可以帮到您。


2
+1 - 在 GSON 上使用 DOM 方法快速实现,但处理大量响应速度非常慢。我用它来进行原型设计,然后在生产环境中优化到流方法。我认为更多人需要意识到 GSON 不是那么慢,重要的是你如何使用它(不是说它最快,只是很多人不使用流方法)。 - Richard Le Mesurier

2
您可以尝试使用一个具有较大缓冲区的BufferedInputStream来包装InputStream,这样可能会获得更好的性能...
3分钟太长了。虽然我很少运行模拟器,但我有一个大小约为1.1MB的JSON资源文件,它在硬件上需要大约5秒钟才能加载和处理。
(这仍然太长了,但仍然比3分钟要好得多)。

我也在处理同样的问题。你有没有在线教程可以描述一下你的解决方案? - s_bei

1
我发现,通过不对JSON中我不需要的所有元素进行建模,我可以大大加快gson.fromJSON的速度。 GSON将仅填充响应类中指定的内容。

1
我发现创建Gson实例是一项非常昂贵的操作,无论是在CPU使用还是内存分配方面。由于Gson实例是线程安全的,构建和重复使用一个静态实例是值得的,特别是在频繁进行序列化/反序列化时。

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