2013-08-23 23 views
5

Nigdy nie widziałem samouczka ani wykładu, który pokazywał klasyczną pętlę for-in z kolejnością po-inkrementacji.pre-increment vs post-increment - szybkość pętli

for (int i=0; i<array.length; i++) {} 

Jeśli użyjesz POST-increment, zmienna "i" zostanie zapisana w pamięci podręcznej, zanim zostanie zwiększona! Ale to nie ma sensu, ponieważ polecenie kończy się bezpośrednio.

Moim zdaniem, to więcej sensu:

for (int i=0; i<array.length; ++i) {} 

Jeśli nie rozumiała aż do teraz, idę trochę dalej (sry za mój angielski):

W pierwszej pętli :

  1. Cache faktyczna wartość i. (Uwaga: nie ruch pomiędzy, więc nie ma powodu, aby to zrobić)
  2. Przyrost I
  3. Śmiało

W drugiej pętli:

  1. minimalnego wzrostu i bezpośrednio
  2. Go przed siebie.

Tak więc druga pętla jest bardziej wydajna bez utraty jakości. Jakieś inne opinie?

+1

Jedynym sposobem sprawdzenia, czy druga pętla jest bardziej wydajna, jest zmierzenie jej (zakładając, że wygenerowany kod zespołu jest inny). Z "int" wątpię, że to robi różnicę. Może z pewnymi typami iteratorów. ** Edytuj ** Mówię tutaj w C++. – juanchopanza

+2

Kiedy mówisz "zmienna * zostanie zbuforowana *", czy używasz jakiegoś zrozumienia lub badania sytuacji, czy po prostu spekulujesz? –

+6

Widziałem tag C++, ale potem zniknął i widzę tylko java, więc napisałem dupę dla java. –

Odpowiedz

6

W Javie nie ma sensu myślenie na tym poziomie. Środowisko wykonawcze Java jest tak daleko od tego, co napisałeś dosłownie w kodzie źródłowym w języku Java, a tego rodzaju rozumowanie traci sens. Konkretnie, kompilator JIT będzie wypaczał twój kod na niezrozumiałość na poziomie kodu maszynowego.

+0

Więc nie ma znaczenia, w jakim przypadku to napiszesz, kompilator robi to, do czego należy? Uczyłbym moich uczniów w ten sposób, post i warunek wstępny jest mentem (jeśli bym był nauczycielem), ponieważ ma on pewną "wiedzę w tle", która zawsze może być interesująca. Ale to ciekawe, że to nie ma znaczenia. Thx, za odpowiedź! :) – codepleb

+0

Kompilator Javy Just-in-Time robi o wiele bardziej skomplikowane rzeczy, które prawie nie pojawiają się na obrazie. Na przykład może usunąć całą twoją * pętlę *, jeśli zdaje sobie sprawę, że nie ma żadnych skutków ubocznych. –

+0

To może być poprawne, ale logika programowania byłaby bardziej odpowiednia, jeśli robię to w "mój" sposób, reklama, rozumiem to. Oczywiście, to nie ma znaczenia, ale dlaczego nie powinienem pisać logiki, kompilator również napisałby? W każdym razie, dobry anwser, ale nie zmieniłbym tego, co robię w tej chwili. :) – codepleb