Java 为对象列表优化fasterxml对象映射器
我想为列表优化ObjectMapper。要求是我需要在列表的每个元素后面添加一个分隔符。我当前的代码如下所示: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");
StringBuilder strBuilder = new StringBuilder();
for (Event event : segregatedList) {
String eventJson = mapper.writeValueAsString(event);
strBuilder.append("\n");
strBuilder.append(eventJson);
}
对于一个长列表(~10000个事件),这需要花费大量的时间。如何优化代码以一次性序列化列表?在java中有多种连接字符串的方法
+
调用字符串被翻译成新的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
,依此类推第四个线程。使用倒计时闩锁确保所有线程都已完成。所有线程完成任务后,将结果合并为一个字符串。