执行Java REST服务性能测试我看到一个意外的模式:在每次调用中创建并返回始终相同的值对象的方法运行得比另一个只返回存储在类或对象字段中的值对象的版本快。什么JVM优化导致这些性能结果?
代码:
@POST @Path("inline") public Response inline(String s) {
return Response.status(Status.CREATED).build();
}
private static final Response RESP = Response.status(Status.CREATED).build();
@POST @Path("staticfield") public Response static(String s) {
return RESP;
}
private final Response resp = Response.status(Status.CREATED).build();
@POST @Path("field") public Response field(String s) {
return resp;
}
字节代码:
- 内联(较快):getstatic,invokestatic,invokevirtual,areturn
- 静态日提交的(更慢):getstatic,areturn
- 对象字段(较慢):aload,getfield,areturn
性能(使用Apache AB,单个线程,几个与一致的结果运行):
- 内联:17078.29 [#/秒](平均)
- 静态字段:5242.64 [# /秒](平均)
- 对象字段:5417.40 [#/秒](平均)
环境:RHEL6 + JDK Oracle 1.7.0_60-b19 64位
JVM是否有可能使用本地代码优化了内联版本,但从来没有考虑优化其他两个版本,因为它们已经很小了?
我认为在上述代码之外最有可能的是某些东西不像您认为的那样工作。 –
“返回总是相同的值对象”......也许REST层知道结果可以被缓存呢? –
发布完整的可编译基准。只有这样我们才能深入了解发生了什么。 – tmyklebu