2015-06-28 157 views
4

在執行將Java對象轉換爲JSON的確切任務之前,我已經測試了以下示例。將Java對象轉換爲JSON對象時的性能問題

Converting Java objects to JSON with Jackson

而且我一直在尋找更好的性能(轉換時間應該是非常少的)。

This article顯示來自this answer的不同API之間的性能統計數據。

我的發現是,例如與我提到的第一個鏈接(與幾個記錄):

 ValueData object = new ValueData(); 
     List<ValueItems> information = new ArrayList<ValueItems>(); 

     ValueItems v1 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat1", 1, "data1"); 
     ValueItems v2 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat2", 2, "data2"); 
     ValueItems v3 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat3", 3, "data3"); 
     ValueItems v4 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat4", 4, "data4"); 
     ValueItems v5 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat5", 5, "data5"); 
     ValueItems v6 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat6", 6, "data6"); 
     ValueItems v7 = new ValueItems(String.valueOf(Calendar.getInstance().getTimeInMillis()), "feat7", 7, "data7"); 

     information.add(v1); 
     information.add(v2); 
     information.add(v3); 
     information.add(v4); 
     information.add(v5); 
     information.add(v6); 
     information.add(v7); 

     object.setInformation(information); 

而且我會用傑克遜這個object轉換:

long smili = Calendar.getInstance().getTimeInMillis(); 

    ObjectWriter ow = new  ObjectMapper().writer().withDefaultPrettyPrinter(); 
    String json = ow.writeValueAsString(object); 
    long emili = Calendar.getInstance().getTimeInMillis(); 
    System.out.println("taken time using jackson = " + (emili - smili) + " milli seconds"); 

而且我現在做用StringBuilder

smili = Calendar.getInstance().getTimeInMillis(); 
    StringBuilder sb = new StringBuilder(); 
    sb.append("{\n\"information\" : [\n"); 

     for (ValueItems vi : object.getInformation()) { 
      sb.append("{\n\"timestamp\" : \""+vi.getTimestamp()+"\","); 
      sb.append("\"feature\" : \""+vi.getFeature()+"\","); 
      sb.append("\"ean\" : "+vi.getEan()+","); 
      sb.append("\"data\" : \""+vi.getData()+"\"\n},");    
     } 

     sb.deleteCharAt(sb.length() - 1); 
     sb.append("]\n}"); 
    emili = Calendar.getInstance().getTimeInMillis(); 
    System.out.println("taken time using StringBuilder = " + (emili - smili) + " milli seconds"); 

我下面給出的時間只是清單size 7:

taken time using jackson = 534 milli seconds 
taken time using StringBuilder = 1 milli seconds 

我想將對象轉換與information list規模超過10K,但時間應該是非常少的。

  1. 使用StringBuilder創建JSON購買將有助於在這種情況下?
  2. 有沒有其他的API給我需要的設施?

請幫我解決這個問題。

+0

好Q,有人更知道那麼我會回答性能,但看看你的StringBuilder代碼和使用Jackson的代碼之間的區別。如果你開始嵌套除字符串之外的對象,Jackson的實現更易於維護,並且StringBuilder代碼會變得瘋狂。傑克遜允許您儘可能地將代碼/序列化問題與您的代碼分開。 –

+1

查看[Afterburner](https://github.com/FasterXML/jackson-module-afterburner)以提高性能。 –

+0

謝謝@SamB。 'AfterBurner'比'StringBuilder'高效。但是我仍然在尋找更好的一個,因爲這對大數據很有效,但對於小尺寸我發現'StringBuilder'更好(如果我們不考慮序列化或反序列化) –

回答

4

感謝薩姆B.

我試圖與jakson加力:

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new AfterburnerModule()); 
ow = mapper.writer().withDefaultPrettyPrinter(); 
json = ow.writeValueAsString(object); 

而且我已經測試與列表大小7,7000,70000和700000:

時機:

For 7:

taken time using jackson = 217 milli seconds 
taken time using StringBuilder = 1 milli seconds 
taken time using after-burner = 25 milli seconds 

對於7000:

taken time using jackson = 310 milli seconds 
taken time using StringBuilder = 31 milli seconds 
taken time using after-burner = 65 milli seconds 

對於70000:

taken time using jackson = 469 milli seconds 
taken time using StringBuilder = 149 milli seconds 
taken time using after-burner = 101 milli seconds 

對於700000:

taken time using jackson = 1120 milli seconds 
taken time using StringBuilder = 705 milli seconds 
taken time using after-burner = 623 milli seconds 

當列表尺寸的增加,加力是有效的。