【问题标题】:Optimizing fasterxml ObjectMapper for list of Objects为对象列表优化 fastxml ObjectMapper
【发布时间】:2018-11-02 06:45:11
【问题描述】:

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

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

    }

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

【问题讨论】:

  • 我认为如果您根据segregatedList 中的元素数量在多个线程中划分任务。例如,如果您使用 4 核 cpu 并且列表大小约为 10000,则将此列表划分为来自 ~ 0 - 2500 的 4 线程第一个线程进程,列表中的第二个 ~2500-5000 等第 4 个线程。使用倒计时锁存器确保所有线程都完成。一旦所有线程完成他们的任务,然后将结果组合成一个字符串。

标签: java jackson objectmapper


【解决方案1】:

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

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

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

提到的属性来优化 json

【讨论】:

    【解决方案2】:

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

    1. 来自 java.lang.String 的 concat() 方法
    2. 使用 + 运算符
    3. 使用字符串缓冲区
    4. 使用 StringBuilder

    根据我的个人分析,我可以说 + 对 String 的调用被翻译成新的 StringBuilder().append( "" )。由于 StringBuilder(String) 构造函数分配了 16 个字符的缓冲区,附加超过 16 个字符将需要重新分配缓冲区。最后,StringBuffer.toString() 调用创建一个带有 StringBuilder 缓冲区副本的新 String 对象。

    因此,如果您不希望同步开销StringBuilder 是最好的选择,我建议您在此处使用StringBuffer。我看到你已经在使用StringBuilder,所以这里几乎没有改进的余地。但是,您可以通过忽略无用的属性来优化生成的 json。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-03
      • 2021-10-05
      • 2019-08-21
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多