2010-07-16 68 views
14

我想在android模擬器上使用gson來做我的對象映射。android:gson的性能

處理約208kb的json數據時,它的速度非常慢。我的json中沒有任何層次結構。

完成對象映射後,我可以看到gson創建了大約500條記錄。

它在android模擬器上花了3分鐘來映射輸入json。

我註釋了我的實體,它包含字符串和幾個浮點數。

我錯過了什麼?

任何想法,最佳實踐將大大幫助。

有沒有快速對象映射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); 
+0

請不要使用Android模擬器進行性能測量。它的性能模型與真實設備的性能模型明顯不同。 – 2013-02-21 03:04:36

回答

2

你可能會獲得更好的性能e如果你將InputStream包裝在BufferedInputStream中,並帶有一個漂亮的大緩衝區...

3分鐘是瘋了。我很少運行模擬器,但我有一個具有〜1.1MB JSON資源的應用程序,需要大約5秒鐘才能在硬件上加載和處理。

(這仍然太長,但仍然)。

+0

我正在與同一問題鬥爭。你有一個在線教程,描述你的解決方案? – 2013-12-23 13:04:17

4

您是否嘗試過將GSON流解析器與Gson對象混合? http://sites.google.com/site/gson/streaming(查找混合閱讀示例)。

這種方法可能有幫助,因爲Gson讀入一個完整的分析樹,然後作用於它。使用大型數組列表時,讀取所有元素並嘗試解析可能會導致大量內存交換(或抖動)。這種方法一次只能讀入一個元素。

希望這會有所幫助。

+2

+1 - GSON上的DOM方法很快實現,但處理大量響應非常緩慢。我將它用於原型,然後優化到Streaming方法進行生產。我認爲更多人需要認識到GSON並不是那麼慢,它如何使用它(不是說它是最快的,只是很多不使用流媒體) – 2012-06-20 09:15:36

1

我發現我可以通過不對JSON中所有不需要的所有元素進行建模來加速gson.fromJSON。 GSON將樂意填寫您的答覆課程中指定的內容。

0

我發現創建一個Gson實例是一個非常昂貴的操作,無論是在CPU使用和內存分配方面。

由於Gson實例是線程安全的,所以構建和重用單個靜態實例是值得的,特別是在經常序列化/反序列化的情況下。