安卓:gson 性能

Posted

技术标签:

【中文标题】安卓:gson 性能【英文标题】:android: gson performance 【发布时间】:2011-03-16 17:12:49 【问题描述】:

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

处理 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);

【问题讨论】:

请不要使用安卓模拟器进行性能测量。它的性能模型与真实设备有很大不同。 【参考方案1】:

我以前见过这样的问题,普遍的共识是Jackson 比 Gson 快得多。有关详细信息,请参阅以下链接:

Jackson Vs. Gson Replace standard Android JSON parser for better performance? http://www.cowtowncoder.com/blog/archives/2009/12/entry_345.html https://***.com/questions/338586/a-better-java-json-library

这里专门讨论 Android:http://ubikapps.net/?p=525

【讨论】:

【参考方案2】:

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

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

希望这会有所帮助。

【讨论】:

+1 - GSON 上的 DOM 方法实现起来很快,但处理大型响应却很慢。我将它用于原型,然后优化到流式生产方法。我认为更多的人需要意识到 GSON 并没有那么慢,而是你如何使用它(不是说它是最快的,只是很多人不使用流媒体)【参考方案3】:

如果您将 InputStream 包装在带有大缓冲区的 BufferedInputStream 中,您可能会获得更好的性能...

3 分钟太疯狂了。我很少运行模拟器,但我有一个带有 ~1.1MB JSON 资产的应用程序,在硬件上加载和处理大约需要 5 秒。

(这仍然太长了,但仍然)。

【讨论】:

我正在与同样的问题作斗争。您是否有描述您的解决方案的在线教程?【参考方案4】:

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

【讨论】:

【参考方案5】:

我发现创建 Gson 实例是一项非常昂贵的操作,无论是在 CPU 使用量还是内存分配方面。

由于 Gson 实例是线程安全的,因此构造和重用单个静态实例是值得的,尤其是在您经常序列化/反序列化的情况下。

【讨论】:

以上是关于安卓:gson 性能的主要内容,如果未能解决你的问题,请参考以下文章

安卓项目怎么导入gson

谷歌 gson 在安卓上运行吗?

安卓怎么用gson解析服务端返回的复杂json数据

Android安卓Gson解析带二级跳转

jsonarray 哪个性能好

ssm+mysql 时间显示相差了12小时的问题 Gson