2017-08-21 70 views
7

Próbuję uzasadnić, w jaki sposób JIT powodów Hotspot. Najbardziej interesuje mnie najnowszy etap kompilacji (kompilator C2). Czy JIT w Javie opiera się na twierdzeniach dotyczących optymalizacji? Gdyby tak było, mógłbym sobie wyobrazić, że istnieją przykłady, w których kod mógłby działać szybciej z włączonymi asercjami.Java, Assertions i JIT

Na przykład w kawałku kodu:

static int getSumOfFirstThree(int[] array) { 
    assert(array.length >= 3); 
    return array[0] + array[1] + array[2]; 
} 
  • Czy JIT, gdy włączone są twierdzenia, być na tyle mądry, aby wyeliminować kontrole granic na dostęp do tablicy?
  • Czy istnieją inne przypadki, o których można pomyśleć (praktyczne lub nie), w których stwierdzenia rzeczywiście poprawią natywny kod, który JIT będzie kompilować?

Odpowiedz

3

W tym przypadku należy wykonać wiele kontroli granicznych i możliwe jest, że JIT będzie mógł je połączyć, tak że zostanie wykonane tylko jedno sprawdzenie, jednak to stwierdzenie nie wyklucza konieczności wykonania kontroli.

Asercje zapobiegają optymalizacji, takich jak wstawianie, ponieważ metoda jest większa, a rozmiar jest czynnikiem decydującym o tym, czy należy wstawiać metodę. Zazwyczaj wstawianie poprawia wydajność, ale w niektórych przypadkach nie, ponieważ może spowodować, że pamięci podręczne procesora L0 lub L1 staną się nieefektywne z powodu generowania większego kodu.

Przykład tego, gdzie asercja może poprawić wydajność, jest mniej więcej taki.

boolean assertionOn = false; 
assert assertionOn = true; 
if (assertionOn) { 
    assumeDataIsGood(); // due to checks elsewhere 
} else { 
    expensiveCheckThatDataMightNotBeGood(); 
} 

Jest to prawdopodobnie anty-wzorzec do stosowania twierdzeń, ale będzie tańszy z twierdzeniami na podstawie intencji.