Jackson JSON parser производительность

несколько сообщений в интернете указывают на Джексона как имеющие лучшую производительность разбора, чем GSON, предоставляя где-то в районе улучшения скорости 20-30%.

вытаскивание нашего парсера 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

traceview output from Jacksontraceview output from Gson

1 ответов


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

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

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