Jersey2 @BeanParam比替代方法要慢得多

问题描述 投票:3回答:1

[正在研究项目时,我将某些方法从内联@QueryParam参数列表迁移到了@BeanParam中,我注意到延迟产生了重大且无法解释的影响。我不确定是什么内部原因导致此问题,因为它似乎不只是新Bean的创建,因为空Bean的速度与没有Bean一样快。同样,添加到Bean中的@QueryParam也按比例增加了延迟,在方法级别上绝对不会发生延迟。

[这两种形式之间的差异在等待时间方面是巨大的,尽管@BeanParam的表现基本相同,但它们花费的时间却长20%。

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

vs

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

我创建了一个最小示例here

我的目标是找到解决方法,因为我真的发现@BeanParam非常好来组织参数组,但我不清楚延迟增加的来源,也许我可以提供一些提示来消除最佳表现。

java performance http jax-rs jersey-2.0
1个回答
2
投票

正如@ paul-samsotha所述,您遇到的额外延迟似乎与在构造bean之后用于将查询参数与bean字段相关联的反射有关。

以您的示例为例,首先注释掉所有Params bean字段并多次运行测试,并在每次运行时将一个字段添加回Params bean中,您将获得以下结果:

无字段:从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
© www.soinside.com 2019 - 2024. All rights reserved.