【问题标题】:android: gson performance安卓:gson 性能
【发布时间】: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);

【问题讨论】:

  • 请不要使用安卓模拟器进行性能测量。它的性能模型与真实设备有很大不同。

标签: android performance gson


【解决方案1】:

【讨论】:

    【解决方案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 实例是线程安全的,因此构造和重用单个静态实例是值得的,尤其是在您经常序列化/反序列化的情况下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-17
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        相关资源
        最近更新 更多