Thực hiện thử nghiệm hiệu năng dịch vụ REST của Java Tôi thấy một mẫu không mong đợi: một phương thức tạo và trả về luôn luôn cùng một đối tượng giá trị trong mỗi lời gọi chạy nhanh hơn phiên bản khác chỉ trả về đối tượng giá trị được lưu trữ trong một lớp hoặc trường đối tượng.Tối ưu hóa JVM nào đang gây ra các kết quả hiệu suất này?
Code:
@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;
}
đang Byte:
- Inline (nhanh hơn): getstatic, invokestatic, invokevirtual, areturn
- tĩnh nộp (chậm hơn): getstatic, areturn
- Trường đối tượng (chậm hơn): aload, getfield, areturn
Performance (sử dụng Apache AB, chủ đề duy nhất, một số chạy với kết quả phù hợp):
- Inline: 17.078,29 [#/sec] (trung bình)
- lĩnh vực tĩnh: 5242,64 [#/sec] (trung bình)
- lĩnh vực Object: 5417,40 [#/sec] (trung bình)
Môi trường: RHEL6 + JDK Oracle 1.7.0_60-b19 64bits
Có khả năng JVM đã tối ưu hóa phiên bản nội tuyến bằng mã gốc, nhưng không bao giờ xem xét tối ưu hóa hai mã kia vì chúng đã khá nhỏ?
Tôi nghĩ rằng rất có thể một điều gì đó không hoạt động theo cách bạn nghĩ, bên ngoài mã trên. –
"Trả về luôn luôn cùng một đối tượng giá trị" ... Có lẽ lớp REST biết rằng kết quả có thể được lưu trữ sau đó? –
Đăng điểm chuẩn hoàn chỉnh. Chỉ khi đó chúng ta mới có thể tìm hiểu những gì đang xảy ra. – tmyklebu