2011-10-12 18 views
6

Googleで検索した後、jacksonがgsonよりも優れたパフォーマンスを示しています。私はgsonをプロジェクトでjacksonに置き換える予定ですが、テストコードを実行すると、jsonとgsonの間のjson構文解析のパフォーマンス

private static final Type PHOTOLINKS_TYPE_GSON = new TypeToken<List<Photo>>() {}.getType(); 
private static final Type PHOTOCAPTIONS_TYPE_GSON = new TypeToken<List<String>>() {}.getType(); 
Gson gson = new Gson(); 
private void testGson(String photoJson, String captionJson) { 
    GSON_MON.start(); 
    List<Photo> photos = gson.fromJson(photoJson, PHOTOLINKS_TYPE_GSON); 
    List<String> photoCaptions = gson.fromJson(captionJson, PHOTOCAPTIONS_TYPE_GSON); 
    GSON_MON.stop(); 
} 

TypeReference<List<Photo>> PHOTOLINKS_TYPE_JACKSON = new TypeReference<List<Photo>>(){}; 
TypeReference<List<String>> PHOTOCAPTIONS_TYPE_JACKSON = new TypeReference<List<String>>(){}; 
ObjectMapper mapper = new ObjectMapper(); 
private void testJackson(String photoJson, String captionJson) { 
    JACKSON_MON.start(); 
    try { 
     List<Photo> photos = mapper.readValue(photoJson, PHOTOLINKS_TYPE_JACKSON); 
     List<String> photoCaptions = mapper.readValue(captionJson, PHOTOCAPTIONS_TYPE_JACKSON); 
    } catch (JsonParseException e) { 
     e.printStackTrace(); 
    } catch (JsonMappingException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    JACKSON_MON.stop(); 
} 

写真は通常のクラスです:

@JsonIgnoreProperties(ignoreUnknown = true) 
private static class Photo implements Serializable { 
private static final long serialVersionUID = 5645393489907650496L; 

public String small; 
public String middle; 
public String orign; 
public String caption; 
public String ow; 
public String oh; 
} 

と写真JSONのようなものです: [{ "ID": "1318403074887"、 "orign": "xxx.jpg"、」 xxx.jpg "、" xxx.jpg "、" oh ":640}、{" id ":" 1318403076793 "、" orign ":" xxx.jpg " 、 "ow":640、 "small": "xxx.jpg"、 "middle": "xxx.jpg"、 "oh":480}、{"id": "1318403092168"、 "orign": "xxx。 x45.jpg "、" xxx.jpg "、" oh ":640}]

私はパフォーマンスをモニターするためにJAMonを使用しています。結果:

  • ハモン・ラベル=ジャクソン、単位=ミリ秒:(LastValue = 18.0、ヒット数= 30.0、平均= 18.4、合計= 552.0、分= 13.0、マックス= 37.0、アクティブ= 0.0、平均は、Active = 1.0、最終値= 4.0、ヒット= 30.0、平均= 2.1666666666666665、合計= 65.0、最小= 0.0、最大= 4.0、アクティブ= 0.0、平均アクティブ= 0.0)最終値= 20.0、ヒット= 30.0、平均= 15.166666666666666、合計= 455.0、最小= 12.0、最大= 25.0、ア​​クティブ= 0.0、平均= 1.0、最大アクティブ= 1.0) (LastValue = 4.0、ヒット= 30.0、平均= 2.2、合計= 66.0、最小= 0.0、最大= 9.0、アクティブ= 0) 。 0、平均アクティブ= 1.0、最大アクティブ= 1.0)
  • JAMon Label = jackson、単位= ms .:(最終値= 19.0、ヒット= 30.0、平均= 16.433333333333334、合計= 493.0、最小= 11.0、最大= 51.0、 (最終値= 2.0、ヒット数= 30.0、平均値= 1.9、合計= 57.0、最小値= 0.0、最大値= 0.0、平均値= 1.0、最大値= 1.0、最大値= 1.0) 、アクティブ= 0.0、平均アクティブ= 1.0、最大アクティブ= 1.0)

gsonはjacksonよりも速く、gsonの平均時間は約2ms、jacksonは約16msですが、私は間違っていますジャクソンを使って?

答えて

5

パフォーマンスモニタリングでは簡単な問題かもしれません。バイトコードをコンパイルするのに十分長い間テストを実行してJVMを "ウォームアップ"していないようです。通常、測定を行う前に少なくとも5〜10秒間テストを実行する必要があります。

おそらく、最初にそれを試してみてください。数値がどのように変化するかをご覧ください。私は両方の数字が増加するだろう - それは小さなオブジェクトのミリ秒の部分を取る必要があります。

+2

はい、あなたは正しいです。 ジャクソンの合計:4742510320ns、平均:4742510ns gson合計:13498619947ns、平均:13498619ns ジャクソンの合計:7667802989ns、平均:7667802ns gson総 私は再度テストを実行し、ナノ秒を使用して監視し、 ジャクソンはgsonよりも高速です。 25132581619ns、平均:25132581ns – situch

+0

いいよ、意味があります。それはうまくいってうれしい! – StaxMan

+0

+1この情報についても同様のことが起こり、テストを数回実行した後に実行時間が4分の1に短縮されました –