Java 为对象列表优化fasterxml对象映射器

Java 为对象列表优化fasterxml对象映射器,java,jackson,objectmapper,Java,Jackson,Objectmapper,我想为列表优化ObjectMapper。要求是我需要在列表的每个元素后面添加一个分隔符。我当前的代码如下所示: StringBuilder strBuilder = new StringBuilder(); for (Event event : segregatedList) { String eventJson = mapper.writeValueAsString(event); strBuilder.append("\n");

我想为列表优化ObjectMapper。要求是我需要在列表的每个元素后面添加一个分隔符。我当前的代码如下所示:

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

    }

对于一个长列表(~10000个事件),这需要花费大量的时间。如何优化代码以一次性序列化列表?

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

  • java.lang.String中的concat()方法
  • 使用+运算符
  • 使用StringBuffer
  • 使用StringBuilder
  • 根据我个人的分析,我可以说
    +
    调用字符串被翻译成新的
    StringBuilder()。由于StringBuilder(String)构造函数分配的缓冲区为16个字符,因此追加超过16个字符将需要重新分配缓冲区。最后,调用StringBuffer.toString()创建一个带有StringBuilder缓冲区副本的新字符串对象


    因此,如果您不希望同步开销
    StringBuilder
    在其他方面最为突出,我建议您在这里使用
    StringBuffer
    。我看到您已经在使用
    StringBuilder
    ,因此这里的改进空间非常小。但是,您可以通过忽略无用的属性来优化生成的json。

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

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

    否则,我可以看到这里的最小改进范围。也许您可以通过忽略Dark Knight提到的属性来优化json,我想如果您根据
    隔离列表中的元素数量将任务划分到多个线程中。例如,如果您使用的是4核cpu,并且列表大小约为10000,请将此列表划分为4个线程:列表中的第一个线程进程从
    ~0-2500
    ,第二个
    ~2500-5000
    ,依此类推第四个线程。使用倒计时闩锁确保所有线程都已完成。所有线程完成任务后,将结果合并为一个字符串。