Jersey2 @ BeanParam значительно медленнее, чем альтернатива - PullRequest
3 голосов
/ 02 марта 2020

Работая над проектом, я перенес некоторые методы из встроенных @QueryParam списков параметров в @BeanParam Я заметил значительное и необъяснимое влияние на задержку.
Я не уверен, что внутренние компоненты вызывают эту проблему, потому что это не кажется быть просто новым созданием Бина, поскольку пустой Бин так же быстр, как и Бин. Также @QueryParam s, добавленные в Бин, пропорционально увеличивают задержку, то же самое определенно не происходит на уровне метода.

Разница между обеими формами огромна с точки зрения задержки, @BeanParam - 20 % дольше, несмотря на то, что делать то же самое.

@Path("test1")
public Response test1(@QueryParam("instring") String one, @QueryParam("instring2") String two)

против

public class Params {
   @QueryParam("instring") String one;
   @QueryParam("instring2") String two;
}
@Path("test2")
public Response test2(@BeanParam Params params)

Я создал минимальный пример здесь .

Моя цель - найти обходной путь для этого, так как я на самом деле @BeanParam очень приятно организовывать группы параметров, и мне неясно, откуда происходит увеличение задержки, возможно, есть какой-то намек, который я могу дать, чтобы устранить перфомент.

1 Ответ

2 голосов
/ 05 марта 2020

Как упомянуто @ paul-samsotha, дополнительная задержка, с которой вы сталкиваетесь, по-видимому, связана с отражением, используемым для связи параметров запроса с полями компонента после создания компонента.

Взяв ваш пример, комментируя все поля компонента Params изначально и многократный запуск тестов, добавляя поле обратно в компонент Params при каждом запуске, вы получаете следующие результаты:

Нет полей: комментирование всех полей класса Params

15:14:53.664 [main] INFO  org.example.ProofOfConcept - Warming up
15:15:35.562 [main] INFO  org.example.ProofOfConcept - Warmed up
15:15:49.244 [main] INFO  org.example.ProofOfConcept - Reqs1: 731.101 10000 in 13.68
15:16:02.968 [main] INFO  org.example.ProofOfConcept - Reqs2: 728.7037 10000 in 13.72
15:16:17.016 [main] INFO  org.example.ProofOfConcept - Req2/Req1 1.0032899

Одно поле: только первый параметр

15:16:57.160 [main] INFO  org.example.ProofOfConcept - Warming up
15:17:26.052 [main] INFO  org.example.ProofOfConcept - Warmed up
15:17:39.715 [main] INFO  org.example.ProofOfConcept - Reqs1: 732.06445 10000 in 13.66
15:17:54.582 [main] INFO  org.example.ProofOfConcept - Reqs2: 672.6759 10000 in 14.87

...

3 поля: первые 3 строковых параметра

15:20:33.870 [main] INFO  org.example.ProofOfConcept - Warming up
15:21:01.859 [main] INFO  org.example.ProofOfConcept - Warmed up
15:21:15.825 [main] INFO  org.example.ProofOfConcept - Reqs1: 716.17847 10000 in 13.96
15:21:30.926 [main] INFO  org.example.ProofOfConcept - Reqs2: 662.2078 10000 in 15.10

...

Все параметры

15:23:55.339 [main] INFO  org.example.ProofOfConcept - Warming up
15:24:25.717 [main] INFO  org.example.ProofOfConcept - Warmed up
15:24:39.376 [main] INFO  org.example.ProofOfConcept - Reqs1: 732.2789 10000 in 13.66
15:24:55.676 [main] INFO  org.example.ProofOfConcept - Reqs2: 613.5346 10000 in 16.30
15:24:55.676 [main] INFO  org.example.ProofOfConcept - Req2/Req1 1.1935413

Производительность постепенно ухудшается по мере добавления большего числа полей Bean.

В качестве обходного пути вы можете обновить класс Bean следующим образом:

@ToString
public static class Params {
    String instring;
    String inint;
    int inint2;
    int inint3;
    String inint4;
    String inint5;
    String inint6;
    String inint7;

    Params(@Context UriInfo allUri){
        MultivaluedMap<String, String> params = allUri.getQueryParameters();
        instring = params.getFirst("instring");
        inint = params.getFirst("inint");
        inint2 = toInt(params.getFirst("inint2"));
        inint3 = toInt(params.getFirst("inint3"));
        inint4 = params.getFirst("inint4");
        inint5 = params.getFirst("inint5");
        inint6 = params.getFirst("inint6");
        inint7 = params.getFirst("inint7");
    }

    int toInt(String value){
        return nonNull(value) ? Integer.parseInt(value) : -1;
    }
}

Это обновление должно устранить отражение Этап картирования и результат в улучшенной производительности:

15:35:16.713 [main] INFO  org.example.ProofOfConcept - Warming up
15:35:45.513 [main] INFO  org.example.ProofOfConcept - Warmed up
15:35:59.493 [main] INFO  org.example.ProofOfConcept - Reqs1: 715.5123 10000 in 13.98
15:36:13.536 [main] INFO  org.example.ProofOfConcept - Reqs2: 712.0986 10000 in 14.04
15:36:13.536 [main] INFO  org.example.ProofOfConcept - Req2/Req1 1.004794
...