Intereting Posts

Производительность Джексона 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 привели к 7-кратному замедлению моего проекта с латентностью более 300 мс за вызов. То же самое действие разбора на GSON занимает менее 50 мс.

Я просмотрел список «gotchas» на Wiki Jackson, но ничего там не выделялось как красный флаг.

  • http://wiki.fasterxml.com/JacksonDataBinding

Например, я не воссоздаю свой 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 ... } 

То, что сериализуется, на самом деле является списком вышеупомянутых элементов.

Вот мои примеры окон просмотра трассировки из каждого прогона. Заметьте, это не аномалия. Я последовательно получаю тот же порядок производительности, что и Гссон, и Джексон разбора одного и того же набора данных.

Сравнение было с Jackson 2.4.2 и Gson 2.2.4

Вывод отслеживания от JacksonВывод traceview от Gson

Код выглядит правильно, и даже в самом худшем случае Джексон должен быть не медленнее, чем Gson; И, конечно, не кратно ничто.

Если вы смогли получить снимок-профайлер для стека вызовов (для непрерывной десериализации на 10+ секунд), это, вероятно, укажет на то, где потрачено лишнее время, и может помочь выяснить виновника.

Я бы по-прежнему дважды проверял, что JsonParser не JsonParser непреднамеренно несколько раз: один сложный случай – это, например, через фреймворки, такие как Jersey (напрямую или через DropWizard), которые могут создавать ресурсы несколько раз, если не сказать, чтобы создавать и использовать экземпляры singleton. Я говорю это, потому что симптомы просто подходят для этого случая, а не потому, что я сомневаюсь, что вы не проводили должной осмотрительности.