Почему создание нескольких объектов ObjectMapper не занимает много времени? - PullRequest
0 голосов
/ 03 апреля 2020

Я выполняю простой тест - я создаю несколько объектов ObjectMapper подряд. Я делаю это, потому что я пытаюсь понять стоимость этого. Существует множество ресурсов, в которых говорится, что ObjectMapper является поточно-ориентированным, и его создание требует больших усилий. Так что я ожидаю увидеть, что каждое создание ObjectMapper займет некоторое время. Но когда я go перебираю строки в Eclipse Debugger, я вижу, что только первое создание ObjectMapper занимает некоторое время. Кто-нибудь может объяснить, почему? Это какая-то оптимизация компилятора? Или я что-то упустил? Вот мой тест:

    String inputString = "{\"key1\":\"value1\"}";
    String inputString2 = "{\"key2\":\"value2\"}";
    String inputString3 = "{\"key3\":\"value3\"}";
    String inputString4 = "{\"key4\":\"value4\"}";

    try {
        HashMap<String, Object> map = new ObjectMapper().readValue(inputString, HashMap.class);
        HashMap<String, Object> map2 = new ObjectMapper().readValue(inputString2, HashMap.class);
        HashMap<String, Object> map3 = new ObjectMapper().readValue(inputString3, HashMap.class);
        HashMap<String, Object> map4 = new ObjectMapper().readValue(inputString4, HashMap.class);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

1 Ответ

1 голос
/ 03 апреля 2020

Я посмотрел на инициализацию ObjectMapper экземпляров и могу проверить описанное поведение:

StopWatch '': running time = 2323937394 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
2233845422  096 %  map1
030696401  001 %  map2
029092790  001 %  map3
030302781  001 %  map4

Кажется, причина в инициализации блоков stati c и полей-членов stati c ObjectMapper экземпляр, который запускается только при первой загрузке класса.

Перед выполнением конструктора ObjectMapper выполняется инициализатор com.fasterxml.jackson.databind.ObjectMapper.<clinit>() stati c, который устанавливает все stati c поля экземпляра ObjectMapper, такие как com.fasterxml.jackson.databind.cfg.BaseSettings.<clinit>() et c.

После этого, когда конструктор ObjectMapper запускается в первый раз, все поля stati c и stati Инициализируются c блоки его незаполненных c членов, например, com.fasterxml.jackson.core.JsonFactory.<clinit>(), что занимает дополнительное время. Эти шаги инициализации stati c выполняются только при первом выполнении построения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...