在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 [#/秒] (平均)
- 静态字段:5242.64 [#/秒] (平均)
- 对象字段:5417.40 [#/秒] (平均)
环境: RHEL6 + JDK Oracle 1.7.0_60-b19 64位
可能JVM优化了内联版本的本机代码,但从未考虑优化其他两个版本,因为它们已经足够小了吗?