我在杰克逊ObjectMapper
周围写了一个简单的包装器,它会将List<?>
转换为String
:
public static <T> String listToString(List<T> list) {
if (list == null) {
return null;
}
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(list);
} catch (JsonProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
但是,如果我在那里传递空ArrayList
,mapper.writeValueAsString(list)
执行大约2秒。我在eclipse中进行调试测试。
为什么这么长时间执行?我做错了什么?
答案 0 :(得分:2)
杰克逊ObjectMapper
创建起来相对昂贵,但一旦创建,它可以非常便宜地重复用于许多转换。您的基准测试存在缺陷,因为它包含测量中的ObjectMapper
创建时间。更好的基准测试会预先创建一个 ObjectMapper
,然后使用相同的映射器执行数百或数千次转换,并计算每次转换的平均时间。如果你这样做,你会看到更多可敬的数字。
ObjectMapper
实例在完全配置后是线程安全的,因此可以安全地执行以下操作(为清晰起见,忽略了异常处理代码)
public class X {
private static final ObjectMapper MAPPER = new ObjectMapper();
public static <T> String listToString(List<T> list) {
if(list == null) return null;
else return MAPPER.writeValueAsString(list);
}
}
答案 1 :(得分:0)
事实证明问题出在调试器中。如果我在调试模式下执行此操作,则执行代码需要2-5秒。但是如果我在没有调试器和日志执行时间的情况下做同样的事情,它会在0,1-0,8毫秒内执行 - 足够快。