Jersey2 @BeanParam 比替代方案慢得多
Jersey2 @BeanParam being significantly slower than the alternative
在一个项目中,我将一些方法从内联 @QueryParam
参数列表迁移到 @BeanParam
我注意到对延迟有显着且无法解释的影响。
我不确定是什么内部机制导致了这个问题,因为它似乎不仅仅是新的 Bean 创建,因为空 Bean 和没有 Bean 一样快。此外,添加到 Bean 中的 @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)
我创建了一个最小示例 here。
我的目标是找到一个解决方法,因为我真的发现 @BeanParam
组织参数组非常好,我不清楚延迟增加的原因,也许有某种提示我可以提供消除性能命中的方法。
如@paul-samsotha 所述,您遇到的额外延迟似乎与构造 bean 后用于将查询参数与 bean 字段相关联的反射有关。
以您的示例为例,最初注释掉所有 Params
bean 字段并 运行 多次测试,在每个 [=54] 上将字段添加回 Params
bean =] 你得到以下结果:
无字段:注释掉参数中的所有字段class
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 class:
@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
在一个项目中,我将一些方法从内联 @QueryParam
参数列表迁移到 @BeanParam
我注意到对延迟有显着且无法解释的影响。
我不确定是什么内部机制导致了这个问题,因为它似乎不仅仅是新的 Bean 创建,因为空 Bean 和没有 Bean 一样快。此外,添加到 Bean 中的 @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)
我创建了一个最小示例 here。
我的目标是找到一个解决方法,因为我真的发现 @BeanParam
组织参数组非常好,我不清楚延迟增加的原因,也许有某种提示我可以提供消除性能命中的方法。
如@paul-samsotha 所述,您遇到的额外延迟似乎与构造 bean 后用于将查询参数与 bean 字段相关联的反射有关。
以您的示例为例,最初注释掉所有 Params
bean 字段并 运行 多次测试,在每个 [=54] 上将字段添加回 Params
bean =] 你得到以下结果:
无字段:注释掉参数中的所有字段class
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 class:
@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