Jackson JSON parser производительность
несколько сообщений в интернете указывают на Джексона как имеющие лучшую производительность разбора, чем GSON, предоставляя где-то в районе улучшения скорости 20-30%.
- http://rick-hightower.blogspot.com/2014/04/new-json-serialization-benchmark.html
- http://tuhrig.de/jaxb-vs-gson-and-jackson/
- http://java.dzone.com/articles/be-lazy-productive-android
вытаскивание нашего парсера GSON и замена на Jackson привели к замедлению 7X в моем проекте с задержкой более 300 мс за вызов. Та же работа синтаксического анализа на GSON занимает меньше чем на 50 мс.
Я просмотрел список "gotchas" на Вики Джексона, но ничто там не выделялось как красный флаг.
например, я не воссоздаю свое 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 в POJOs. Ля образец 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, анализируя один и тот же набор данных.
сравнение было с Джексоном 2.4.2 и Gson 2.2.4
1 ответов
код выглядит правильным, и даже в худшем случае Джексон должен быть не медленнее Gson; и, конечно, не кратным чему-либо.
Если вам удалось получить снимок профилировщика для стека вызовов (для непрерывного выполнения десериализации в течение 10+ секунд), это, вероятно, укажет, где тратится избыточное время, и может помочь выяснить виновника.
Я бы все равно перепроверил это JsonParser
не случайно построено несколько раз: один сложный случай для пример через фреймворки, такие как Jersey (напрямую или через DropWizard), которые могут создавать ресурсы несколько раз, если им не сказано создавать и использовать одноэлементные экземпляры.
Я говорю это потому, что симптомы как раз подходят для этого случая, а не потому, что сомневаюсь, что вы не проявили должной осмотрительности.