Wykonywanie testu wydajności usług REST Java Widzę nieoczekiwany wzorzec: metoda, która tworzy i zwraca zawsze ten sam obiekt o wartości w każdym wywołaniu działa szybciej niż inna wersja, która właśnie zwraca obiekt wartości przechowywany w polu klasy lub obiektu.Co optymalizacja JVM powoduje te wyniki wydajności?
Kod:
@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;
}
kod binarny:
- inline (szybsze) getstatic, invokestatic, invokevirtual, areturn
- statyczne złożony (wolniej) getstatic, areturn
- Pole obiektu (wolniej): aload, getfield, areturn
Wydajność (stosując Apache AB, pojedyncze nici, kilka serii ze zgodnych wyników):
- wbudowanych: 17078.29 [#/s] (średnia)
- statyczne pole: 5242,64 [#/s] (średnia)
- Przedmiot doświadczenia: 5417,40 [#/s] (średnia)
Środowisko: RHEL6 + JDK Oracle 1.7.0_60-b19 64bits
Czy możliwe jest, że JVM zoptymalizowała wersję wbudowaną z natywnym kodem, ale nigdy nie rozważała optymalizacji pozostałych dwóch, ponieważ są one już dość małe?
Myślę, że najprawdopodobniej coś nie działa tak, jak myślisz, poza powyższym kodem. –
"Zwraca zawsze ten sam obiekt wartości" ... Być może warstwa REST wie, że wynik może być wtedy buforowany? –
Prześlij kompletny, możliwy do porównania test porównawczy. Tylko wtedy możemy zagłębić się w to, co się dzieje. – tmyklebu