Pętla for - optymalizacja, co wybrać?

0

Pytanie tyczy się programowania w ogóle, ponieważ jednak obecnie zajmuje się c# więc pytanie zadam w tym dziale.

Mam pętle.

Która z poniższych konstrukcji bedzie najszybsza/najwydajniejsza ?
inaczej mówiąc:

  1. Czy bardziej opłaca się wywoływać wiele razy tą samą metode , w tym przypadku ToString(),
  2. Czy lepiej tworzyć za każdym razem obiekt string i jego używać dalej w pętli,
  3. Czy lepiej utworzyć obiekt string przed pętlą (ewentualnie StringBuilder)

czy nie ma to zadnego znaczenia bo kompilator i tak sobie sam to zoptymalizuje ?

for(i=0; i<1000; i++)
{
jakisObiekt = cosZwracaJakisObiekt();

...

jakasMetodaPrzyjmujacaString(jakisObiekt.ToString());
jakisKontener[jakisObiekt.ToString()] = cos;
...itd, wiele razy uzywa się jakisObiekt.ToString()
}

vs

for(i=0; i<1000; i++)
{
jakisObiekt = cosZwracaJakisObiekt();
string str = jakisObiekt.ToString();

...

jakasMetodaPrzyjmujacaString(str);
jakisKontener[str] = cos;
..itd, wiele razy uzywa się str
}

vs

string str = "";
for(i=0; i<1000; i++)
{
jakisObiekt = cosZwracaJakisObiekt();
str = jakisObiekt.ToString();

...

jakasMetodaPrzyjmujacaString(str);
jakisKontener[str] = cos;
..itd, wiele razy uzwya się str
}

???

0

Zależy jak działa metoda ToString. Jeśli zwraca po prostu istniejący łańcuch to wszystkie 3 metody będą bardzo podobne.
Jeśli łańcuch jednak musi być zbudowany, to metoda 1 odpada.
Metoda 3 jest teoretycznie szybsza od 2, jednak niedostrzegalnie, wybierz tą która jest wygodniejsza.

0

W zasadzie ten dylemat da się łatwo rozwiązać stosując się do dwóch zasad:

  1. DRY - Don't Repeat Yourself. Czyli się nie powtarzaj się.
  2. WWW - Wywal Wszystko W ... z pętli. Czym mniej rzeczy robisz w pętli tym szybciej.

PS. jeżeli zależy Ci na maksymalnej optymalizacji to nigdy nie polegaj na hasłach w stylu "nasz kompilator zoptymalizuje Twój kod za Ciebie". To jest taki pic na wodę, co prawda w pewnym zakresie kod jest optymalizowany, ale na pewno nie w takim jaki myślisz. A po drugie kompilator C# jest młody i bardzo bardzo mało optymalizuje (w porównaniu z "dojrzałymi" kompilatorami np. C++ czy Java)

0

Odp: 3 i do tego 'ewentualnie StringBuilder' ;)

Pozostale odpowiedzi odpadaja, bo String w C# jest obiektem niezmienialnym, czyli kazde przekazanie tworzy kopie. Kompilator zdaje sie cos optymalizuje, ale wykorzystanie StringBuildera pozwala w ogole uniknac tworzenia kopii stringow.

PS. Na przyszlosc - wystarczy 'wlaczyc stoper', zapuscic duza petle i juz bedziesz znal dobra odpowiedz ;)

0

Stringi w C# są przekazywane przez referencję (to obiekty klasy String) i dlatego są niezmienialne, aby referencja była zawsze prawidłowa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1