互联网上的多个帖子指向杰克逊,因为它具有比GSON更好的解析性能,在附近提供了20-30%的速度提升。
拔出我们的GSON解析器并替换为Jackson导致我的项目减速7倍,每次调用的延迟超过300毫秒。 GSON上的相同解析工作不到50毫秒。
我浏览了杰克逊维基上的“陷阱”清单,但没有任何东西作为红旗突出。
例如,我没有重新创建我的ObjectMapper
,我正在使用ObjectReader
来读取所有JSON。以下是一些示例代码:
public class JsonParser {
@Nonnull
private final ObjectMapper objectMapper;
public JsonParser() {
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(DateFormatUtil.getGmtIso8601DateFormat());
SimpleModule simpleModule = new SimpleModule();
objectMapper.registerModule(simpleModule);
this.objectMapper = objectMapper;
}
public <T> T fromJson(InputStream inputStream, Class<T> clazz) throws IOException {
ObjectReader reader = objectMapper.reader(clazz);
return reader.readValue(inputStream);
}
}
上面的对象被创建一次,并在应用程序的持续时间内用于将JSON转换为POJO。这里可以看到样本POJO:
@JsonSerialize(include= Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ActivityEntity {
public ActivityObjectEntity actor;
public ActivityObjectEntity object;
public ActivityObjectEntity provider;
public ActivityObjectEntity target;
public ActivityObjectEntity generator;
public String content;
public String title;
public String verb;
public String url;
public Date published;
public Date updated;
// other properties omitted ...
}
被序列化的内容实际上是上述项目的列表。
以下是每次运行的示例跟踪视图窗口。注意,这不是一个异常现象。我一直从Gson和Jackson解析同一数据集中获得相同的性能顺序。
与Jackson 2.4.2和Gson 2.2.4进行比较
答案 0 :(得分:3)
代码看起来是正确的,即使在最糟糕的情况下,杰克逊应该不比Gson慢;当然不是任何东西的倍数。
如果你能够为调用堆栈获取一个探查器快照(用于连续运行反序列化10秒以上),那么可能会指出花费多少时间,并且可以帮助找出罪魁祸首。
我仍然会仔细检查JsonParser
是不是无意中多次构造的:一个棘手的情况是例如通过Jersey(直接或通过DropWizard)这样的框架可以多次构造资源,除非告知构造和使用单例实例。
我这样说是因为症状很适合这种情况,不是因为我怀疑你没有做过尽职调查。