将Java对象转换为JSON对象时的性能问题

Kri*_*ran 4 java json jackson

在完成将Java对象转换为JSON的确切任务之前,我已经测试了以下示例。

使用Jackson将Java对象转换为JSON

我一直在寻找更好的性能(转换时间应该更少)。

本文通过此答案显示了不同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);
Run Code Online (Sandbox Code Playgroud)

我将object通过使用Jackson 来转换它:

    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");
Run Code Online (Sandbox Code Playgroud)

现在我正在使用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");
Run Code Online (Sandbox Code Playgroud)

我得到了如下清单size7 所示的时间:

taken time using jackson = 534 milli seconds
taken time using StringBuilder = 1 milli seconds
Run Code Online (Sandbox Code Playgroud)

我想转换information list大小超过10k 的对象,但时间应该非常短。

  1. StringBuilder在这种情况下,使用创建JSON购买会有所帮助吗?
  2. 是否有其他API提供我需要的功能?

请帮我。

Kri*_*ran 5

谢谢山姆B。

我已经尝试过用jakson-afterburner:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new AfterburnerModule());
ow = mapper.writer().withDefaultPrettyPrinter();
json = ow.writeValueAsString(object);
Run Code Online (Sandbox Code Playgroud)

我已经测试了列表大小7、7000、70000和700000:

时间是:

对于7:

taken time using jackson = 217 milli seconds
taken time using StringBuilder = 1 milli seconds
taken time using after-burner = 25 milli seconds
Run Code Online (Sandbox Code Playgroud)

对于7000:

taken time using jackson = 310 milli seconds
taken time using StringBuilder = 31 milli seconds
taken time using after-burner = 65 milli seconds
Run Code Online (Sandbox Code Playgroud)

对于70000:

taken time using jackson = 469 milli seconds
taken time using StringBuilder = 149 milli seconds
taken time using after-burner = 101 milli seconds
Run Code Online (Sandbox Code Playgroud)

对于700000:

taken time using jackson = 1120 milli seconds
taken time using StringBuilder = 705 milli seconds
taken time using after-burner = 623 milli seconds
Run Code Online (Sandbox Code Playgroud)

当列表大小增加时,加力燃烧器很有效。