优化fasterxml ObjectMapper的对象列表

时间:2018-11-02 06:45:12

标签: java jackson objectmapper

我想为列表优化ObjectMapper。要求是我需要在列表的每个元素之后添加定界符。我当前的代码如下:

    StringBuilder strBuilder = new StringBuilder();
    for (Event event : segregatedList) {
        String eventJson = mapper.writeValueAsString(event);
        strBuilder.append("\n");
        strBuilder.append(eventJson);

    }

长列表(〜10000个事件)要花费大量时间。如何优化代码以一次完成列表的序列化?

2 个答案:

答案 0 :(得分:0)

在Java中有多种连接字符串的方法。

    java.lang.String中的
  1. concat()方法
  2. 使用+运算符
  3. 使用StringBuffer
  4. 使用StringBuilder

根据我的个人分析,我可以说对String的+调用被转换为新的StringBuilder().append( "" )。由于StringBuilder(String)构造函数分配的缓冲区包含16个字符,因此追加16个以上的字符将需要重新分配缓冲区。最后,StringBuffer.toString()调用使用StringBuilder缓冲区的副本创建一个新的String对象。

因此,如果您不希望同步开销StringBuilder在其他情况中表现最好,我建议您在此处使用StringBuffer。我看到您已经在使用StringBuilder,因此这里的改进空间很小。但是,您可以通过忽略无用的属性来优化生成的json。

答案 1 :(得分:0)

映射器实例是线程安全的,因此您可以将mapper.writeValueAsString拆分为并行作业。我想如果您不用担心它们的附加顺序,可能会有所帮助!

segregatedList.parallelStream().map(event -> mapper.writeValueAsString(event)).collect(Collectors.joining("\n")))

否则,我在这里看到的改进范围很小。也许您可以通过忽略 Dark Knight

中提到的属性来优化json