在 Java REST 服务性能测试中,我得到了一个意想不到的模式:在每次调用中创建并返回始终相同的值对象的方法比只返回存储在类或对象字段中的值对象的另一个版本运行得更快。
代码:
@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 [#/sec](平均值)
- 静态场:5242.64 [#/sec](平均值)
- 对象字段:5417.40 [#/sec](平均值)
环境:RHEL6 + JDK Oracle 1.7.0_60-b19 64bits
JVM是否有可能使用本机代码优化了内联版本,但从未考虑优化其他两个,因为它们已经很小了?