2010-12-18 21 views
16

Czy muszę zoptymalizować moje pętle FOR, jak poniżej, czy kompilator zrobi to za mnie?Optymalizacja pętli for - potrzebna czy nie?

//this is slow, right? 
for (int i = 0; i < menuItem.DropDownItems.Count; i++) 
{ 
    ... 
} 

//this should be much faster right? 
for (int i = 0, count = menuItem.DropDownItems.Count; i < count; i++) 
{ 
    ... 
} 

PS. Założę się, że to już zostało wysłane, ale nie znalazłem nic, przepraszam za ewentualny dup.

PPS. Przepraszam, koduję dużo JavaScript - gdzie musimy myśleć o tego rodzaju optymalizacjach ... Może się wydawać absurdalny w świecie .net.

+10

Napisałeś kod w obie strony. Jeśli chcesz wiedzieć, który jest szybszy * uruchom je oba, zmierz czas każdego z nich, a potem dowiesz się *. Nie musisz pytać internetu, aby odgadnąć, kiedy w ciągu kilku sekund możesz uzyskać ostateczną odpowiedź. –

Odpowiedz

19

Cóż, to zależy od tego jak DropDownItems.Count realizowany jest - ale szczerze to prawdopodobne być proste pole oparciem nieruchomość ... co zrobić pierwszy kod tak szybko jak drugiego, ale znacznie bardziej czytelny .

Najpierw odczytywanie, a następnie mierzenie wydajności i mikrooptymalizacja tylko w razie potrzeby.

Tam, gdzie to możliwe, wolę pętlę foreach, aby rozpocząć od ... znowu, ze względu na czytelność.

Nawet jeśli chcesz do chcesz użyć zmiennej tymczasowej, chciałbym trzymać pętlę for się proste, hoising odliczanie do oddzielnej zmiennej. Wprawdzie oznacza to szerszy zakres, ale jest prostsza:

int count = menuItem.DropDownItems.Count; 
for (int i = 0; i < count; i++) 
{ 
    ... 
} 

Tyle tylko osobiste preferencje chociaż.

+0

+1 dla komentarza "Najpierw do odczytu". :) Jednak pętla foreach nie działałaby tutaj bezpośrednio z powodu obsady, prawda? W każdej iteracji wymagałoby to dodatkowych rzutów. – Mehrdad

+0

@ Lambert: W tej chwili trudno powiedzieć, ponieważ nie widzieliśmy żadnego kodu w pętli. Ale jeśli istnieje obsada z powodu "foreach", zwykle będzie to obsada w ciele pętli z "for" w każdym razie. –

+2

Zgadzam się, również z tym interfejsem, że golenie tej nanosekundy nie rozjaśni każdego dnia. Te rzeczy są orzeszkami ziemnymi w porównaniu do czasu, jaki zajmuje odświeżenie ekranu. Skoncentruj się na responsywnym interfejsie użytkownika, nie blokując wątku interfejsu użytkownika, co spowoduje uśmiech na twarzy użytkownika. – gjvdkamp

0

Co to jest część ...? W każdym pytaniu tego rodzaju, moją pierwszą odpowiedzią jest pytanie: "Czy w tym przypadku ma to znaczenie?" Wydajność jest zawsze względna. Jeśli ta dokładna linia kodu znajduje się na stosie lub na jej końcu w więcej niż 10% czasu, to warto się martwić, a to zwykle jest mało prawdopodobne.

Powiązane problemy