for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
W pętli for i while, która z nich jest lepsza, pod względem wydajności?dla i podczas pętli w C#
for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
W pętli for i while, która z nich jest lepsza, pod względem wydajności?dla i podczas pętli w C#
(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.Length
w 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 ...
Ani jeden. Są one równoważne. Można pomyśleć, że pętla "for" jest bardziej kompaktowym sposobem zapisu pętli while.
Powiedziałbym, że są takie same i nigdy nie powinieneś robić takich mikro-optymalizacji.
Tak, są to równoważne fragmenty kodu.
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.
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.
Czy możesz podać źródła i cytowania do optymalizacji przerw w podnoszeniu długości? – Krythic
@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
NoxMortem Dzięki – Krythic