2011-01-21 12 views
28

W klasie Java String The wykończenia sposób ten zawiera:Unikanie getfield opcodu

int off = offset;  /* avoid getfield opcode */ 
char[] val = value; /* avoid getfield opcode */ 

Jestem nieco zaskoczony komentarzu "uniknąć getfield opcodu" ...

Co czy to znaczy? (Biorę to w ten unika się stosowania getfield w kodu bajtowego, ale dlaczego jest to Dobra Rzecz [TM]?)

Czy to aby zapobiec tworzeniu obiektu w przypadku wykończenia nic nie robi (a więc ten jest zwracany) lub?

Odpowiedz

20

Moja przypuszczenie jest to, że chodzi o to, aby skopiować wartości do zmiennych lokalnych raz, aby uniknąć konieczności pobierania wartości pola wielokrotnie z hałdy dla każdej iteracji pętli w ciągu najbliższych kilku liniach.

Oczywiście, to nasuwa pytanie, dlaczego ta sama uwaga nie została zastosowana do zmiennej lokalnej "len". (Spodziewałbym się również, że JIT i tak uniknie ponownej instalacji, zwłaszcza, że ​​zmienne są ostateczne.)

+7

Komentarz nie dotyczy "len", ponieważ len jest aktywnie modyfikowany w metodzie, więc i tak musi to być zmienna lokalna. "off" i "val" z drugiej strony nie są modyfikowane, ale istnieją wyłącznie w celu optymalizacji. – Lars

+0

@Lars: Dobrze zauważony; Nie widziałem zmiany w len. –

+0

@JonSkeet Jeśli osobiście pisałeś tę bibliotekę, czy spodziewałbyś się tego zrobić? Lub po prostu polegał na JIT do mikro-optymalizacji? – corsiKa

11

getfield służy do pobrania zmiennej członkowskiej klasy.

Jak widać od pozostałego kodu:

while ((st < len) && (val[off + st] <= ' ')) { 
    st++; 
} 
while ((st < len) && (val[off + len - 1] <= ' ')) { 
    len--; 
} 

Więc kiedy jesteś w pętli, to musi wykonać getfield każdym razem odwoływać value lub offset. Jeśli pętla działa przez długi czas, możesz ponieść dużą wydajność (ponieważ za każdym razem, gdy testowany jest stan pętli, getfield jest egzekwowane zarówno dla offset jak i value). Używając zmiennych lokalnych off i val, zmniejszasz wydajność.

+0

Uzgodniono, z wyjątkiem tego, że jest to poprawne tylko dla niezoptymalizowanego kodu. Kiedy JIT angażuje się, nie ma to już znaczenia. JIT dokonuje optymalizacji prawdopodobnie poprzez wpisanie wartości do rejestru; jest to banalnie dozwolone, ponieważ jest w pełni równoważne. Przy wartości końcowej jest to oczywiste. Ale możliwe byłoby nawet bez niego. – maaartinus

+6

JIT * może * zoptymalizować to. Np. Nie oczekuj tej optymalizacji na Dalvik. Ciągnięcie pola do lokalnego może być przydatne z innych powodów, takich jak sprawdzanie zerowe dla pola, do którego można uzyskać dostęp jednocześnie. – NateS