2009-02-16 11 views

Odpowiedz

46

(aktualizacja) W rzeczywistości - istnieje jeden scenariusz, w którym konstrukcja for jest bardziej wydajna; zapętlanie w tablicy. Kompilator/JIT ma optymalizacje dla tego scenariusza tak długo jak używaszarr.Lengthw stanie:

for(int i = 0 ; i < arr.Length ; i++) { 
    Console.WriteLine(arr[i]); // skips bounds check 
} 

W tym konkretnym przypadku, to pomija granice kontroli, jak to już wie, że nigdy nie będzie być poza zasięgiem. Co ciekawe, jeśli „dźwig” arr.Length spróbować zoptymalizować go ręcznie, możesz temu zapobiec:

int len = arr.Length; 
for(int i = 0 ; i < len ; i++) { 
    Console.WriteLine(arr[i]); // performs bounds check 
} 

Jednak z innych pojemników (List<T> itp), podnoszący jest dość rozsądna jak ręczną mikro optymalizacji.

(aktualizacja end)


Ani; pętla for jest mimo wszystko oceniana jako pętla while pod maską.

Przykładowo 12.3.3.9 ECMA 334 (ostateczne przyporządkowania) nakazuje, dla pętli:

for (for-initializer ; for-condition ; for-iterator) embedded-statement 

zasadniczo równoważnym (z Określony przypisania perspektywy (nie całkiem tak samo, jak mówi „kompilator musi wygenerować ten IL ")) jako:

{ 
    for-initializer ; 
    while (for-condition) { 
     embedded-statement ; 
     LLoop: 
     for-iterator ; 
    } 
} 

z kontynuowania wypowiedzi kierowane instrukcji for jest tłumaczona na instrukcje goto skierowane na etykietę LLoop. Jeśli warunek jest pominięty z wyrażenia for, to ocena określonego przypisania przebiega tak, jakby dla warunku została zastąpiona wartością true w powyższym rozszerzeniu .

Teraz, to nie znaczy, że kompilator musi zrobić dokładnie to samo, ale w rzeczywistości jest dość dużo robi ...

+0

Czy możesz podać źródła i cytowania do optymalizacji przerw w podnoszeniu długości? – Krythic

+0

@Krythic natknął się na to: https://codeblog.jonskeet.uk/2009/01/29/for-vs-foreach-on-arrays-and-lists/ wpis na blogu od Jona Skeeta. – NoxMortem

+0

NoxMortem Dzięki – Krythic

2

Ani jeden. Są one równoważne. Można pomyśleć, że pętla "for" jest bardziej kompaktowym sposobem zapisu pętli while.

12

Powiedziałbym, że są takie same i nigdy nie powinieneś robić takich mikro-optymalizacji.

6

Wydajność będzie taka sama. Jednakże, chyba że potrzebujesz dostępu do zmiennej i poza pętlą, powinieneś użyć pętli for. To będzie czystsze, ponieważ i będzie mieć zakres tylko wewnątrz bloku.

3

Efektywność programu pochodzi z odpowiednich algorytmów, dobrego projektu obiektu, inteligentnej architektury programu itp.

Golenie cyklu lub dwóch z pętlą dla pętli vs, podczas gdy pętle NIGDY nie spowodują zbytniego powolnego programu lub szybkiego spowolnienia programu.

Jeśli chcesz poprawić wydajność programu w tej sekcji, znajdź sposób na częściowe rozwinięcie pętli (patrz Duff's Device) lub popraw wydajność tego, co dzieje się wewnątrz pętli.