我想为列表优化ObjectMapper。要求是我需要在列表的每个元素之后添加定界符。我当前的代码如下:
StringBuilder strBuilder = new StringBuilder();
for (Event event : segregatedList) {
String eventJson = mapper.writeValueAsString(event);
strBuilder.append("\n");
strBuilder.append(eventJson);
}
长列表(〜10000个事件)要花费大量时间。如何优化代码以一次完成列表的序列化?
答案 0 :(得分:0)
在Java中有多种连接字符串的方法。
根据我的个人分析,我可以说对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