konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Ostatnio bawilem sie z jakims analizatorem kodu i jednym z bledow, ktore mi wytknal bylo to:
"Avoid calling methods in conditions of for loops"

for (int i = 0; i < tables.size (); i++)
...

Zawsze tak robie, wydawalo mi sie to najnaturalniejsza rzecza na swiecie - a tu taka niespodzianka. Chwile zajelo mi wgryzienie sie, czemu mialbym tak nie robic, ale juz chyba wiem...

Czekam na Wasze odpowiedzi (nagrod nie bedzie)

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Szczerze mówiąc nie pamiętam czy w javie to działa w ten sposób, ale podejrzewam, że metoda wywołuje się niepotrzebnie przy każdej iteracji, chociaż w tym wypadku zawsze zwraca to samo.Piotr Picheta edytował(a) ten post dnia 01.07.10 o godzinie 16:42

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Np. rozmiar tabeli może zmieniać się podczas iteracji?

W szczególności sama tabela może stać się nullem podczas iteracji i nieszczęście gotowe...

Zdecydowanie bardziej wolę do takich zadań iteratory.Błażej Kępa edytował(a) ten post dnia 01.07.10 o godzinie 16:56

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Wlodzimierz Mazur:
Ostatnio bawilem sie z jakims analizatorem kodu i jednym z bledow, ktore mi wytknal bylo to:
"Avoid calling methods in conditions of for loops"

for (int i = 0; i < tables.size (); i++)[/quote]> ...[quote]

Zawsze tak robie, wydawalo mi sie to najnaturalniejsza rzecza na swiecie - a tu taka niespodzianka. Chwile zajelo mi wgryzienie sie, czemu mialbym tak nie robic, ale juz chyba wiem...

Czekam na Wasze odpowiedzi (nagrod nie bedzie)

Tak, chodzi o potencjalnie zwielokrotnione wyliczanie. Prawda jest taka, że w 99% nie ma znaczenia gdzie to umieścisz i raczej nie nazwałbym tego złą praktyką.

A podręcznikowa pętla (jeśli już dyskutujemy akademicko :) wygląda tak:


for (int i = 0, size = tables.size(); i < size; i++)
...


> Błażej Kępa:
Np. rozmiar tabeli może zmieniać się podczas iteracji?

W szczególności sama tabela może stać się nullem podczas iteracji i nieszczęście gotowe...

Zdecydowanie bardziej wolę do takich zadań iteratory.

Np. dlatego, że default-owo przy każdej modyfikacji dostajesz ConcurrentModificationException ?Pawel Dolega edytował(a) ten post dnia 01.07.10 o godzinie 17:37

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Pawel Dolega:
Np. dlatego, że default-owo przy każdej modyfikacji dostajesz ConcurrentModificationException ?

Na ArrayLiscie ConcurrentModificationException ?

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Błażej Kępa:
Pawel Dolega:
Np. dlatego, że default-owo przy każdej modyfikacji dostajesz ConcurrentModificationException ?

Na ArrayLiscie ConcurrentModificationException ?

Ehem...
Kod pisany w locie więc mogą być błędy kompilacji - strzelam w ConcurrentModificationException jak w dym przy drugiej iteracji.


List<Long> list = new ArrayList<Long>();
list.add(1L);
list.add(2L);
list.add(3L);

Iterator<Long> iter = list.iterator();
while(iter.hasNext()) {
System.out.println("Test " + iter.next();
list.add(5L);
}


Tyle odnośnie przewagi iteratorów nad for(i... < list.size()...).
Nie to żebym twierdził, że jest sens dodawać coś w locie w trakcie iteracji ani żebym twierdził, że jeden sposób iteracji jest lepszy od drugiego (ani że ma to jakiekolwiek znaczenie:)Pawel Dolega edytował(a) ten post dnia 01.07.10 o godzinie 17:47

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Pawel Dolega:
Tyle odnośnie przewagi iteratorów nad for(i... <
> list.size()...).

Ach o to chodziło. Sorry, źle zrozumiałem Twój poprzedni post.

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Pawel Dolega:
Tak, chodzi o potencjalnie zwielokrotnione wyliczanie. Prawda jest taka, że w 99% nie ma znaczenia gdzie to umieścisz i raczej nie nazwałbym tego złą praktyką.

To ja się znów będę spierał, bo to zdecydowanie jest zła praktyka:P Prawdą jest, że w większości przypadków nie ma to znaczenia, ale za to są takie, gdzie jest to bardzo ważne. Dlaczego więc zawsze nie robić dobrze, skoro to takie proste? :)

Anyway, wszystko zależy od kolekcji - są takie, gdzie size() jest po prostu odczytaniem inta, a są takie (jeśli mnie pamięć nie myli np. ConcurrentLinkedQueue) gdzie za każdym razem zliczane są wszystkie elementy - może nawet synchronicznie! A wówczas to już jest znacząca strata prędkości.

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

@Dariusz - dlaczego zła praktyka? jeśli dla 99% przypadków to wystarcza, po co sobie zawracać głowę. Złą praktyką jest pisanie kodu który nikomu nie jest potrzeby (bo może kiedyś tam będzie...).
Druga rzecz - strata prędkości - skąd wiesz? użyłeś kiedyś profilera żeby sprawdzić jaki to ma wpływ? Po co optymalizować bez potrzeby.

Ogólna zasada jest taka: jeśli masz jakiś problem do rozwiązania, znajdujesz najprostsze rozwiązanie, inaczej powstają niezłe potworki. W tym wypadku chcesz przeiterować po liście, więc najprostsza jest ta pętla.

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Kamil Hark:
Druga rzecz - strata prędkości - skąd wiesz? użyłeś kiedyś profilera żeby sprawdzić jaki to ma wpływ? Po co optymalizować bez potrzeby.

Badałem różne pętle pobierając czas ich rozpoczęcia, zakończenia i obliczałem różnicę. I czasem jest różnica. Podobnie jak iterowanie po liście jest dłuższe niż po tablicy, a wywołanie allAll(n) jest często szybsze niż n*add().

Samo wywołanie metody w Javie jest zwykle kosztowne, już na tym, że wywołuje się ją tylko raz, ma się pewien zysk czasu wykonania (tak, BARDZO MAŁY, wiem - ale jednak).

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Kamil Hark:
@Dariusz - dlaczego zła praktyka? jeśli dla 99% przypadków to wystarcza, po co sobie zawracać głowę. Złą praktyką jest pisanie kodu który nikomu nie jest potrzeby (bo może kiedyś tam będzie...).
Druga rzecz - strata prędkości - skąd wiesz? użyłeś kiedyś profilera żeby sprawdzić jaki to ma wpływ? Po co optymalizować bez potrzeby.

Ogólna zasada jest taka: jeśli masz jakiś problem do rozwiązania, znajdujesz najprostsze rozwiązanie, inaczej powstają niezłe potworki. W tym wypadku chcesz przeiterować po liście, więc najprostsza jest ta pętla.

Darkowi chodzi o to, żeby używać for-a w takiej postacji


for (int i = 0, size = tables.size(); i < size; i++)
...


Trudno tu mówić o jakimś nadmiarowym kodzie czy spadku czytelności.

Generalnie to co napisałeś to święte słowa - osobiście uważam, że miażdżąca większość programistów ma zapędy w kierunku niepotrzebnej optymalizacji lub generalizacji. Ale to już temat na osobny wątek...

Edit: Darek zdążył przede mną...Pawel Dolega edytował(a) ten post dnia 03.07.10 o godzinie 09:28
Piotr Nowicki

Piotr Nowicki JFB Systems,
właściciel

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Wlodzimierz Mazur:
Ostatnio bawilem sie z jakims analizatorem kodu i jednym z bledow, ktore mi wytknal bylo to:
"Avoid calling methods in conditions of for loops"

for (int i = 0; i < tables.size (); i++)[/quote]> ...[quote]

Zawsze tak robie, wydawalo mi sie to najnaturalniejsza rzecza na swiecie - a tu taka niespodzianka. Chwile zajelo mi wgryzienie sie, czemu mialbym tak nie robic, ale juz chyba wiem...

Czekam na Wasze odpowiedzi (nagrod nie bedzie)

Ja to robie tak:

for (Typ zmienna : kolekcja){
......
}

To podobno lepsza praktyka niż zwykła pętla for i używanie iteratorów. Dla mnie jest bardziej czytelna

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Piotr Nowicki:
Ja to robie tak:

for (Typ zmienna : kolekcja){
......
}

To podobno lepsza praktyka niż zwykła pętla for i używanie iteratorów. Dla mnie jest bardziej czytelna

Yep, na pewno bardziej czytelna. Ale warto wiedzieć co tam się dzieje w tle kiedy używa się tej konstrukcji i jakie są tego implikacje.
for(;;) czasem się używa ze względu na potrzebę znajomości indeksu danego obiektu w kolekcji, for (:) nie zapewnia takiej wiedzy.

Z innej beczki, w kwestii efektywności i kolekcji, przypomniała mi się kolejna oczywistość: dlaczego lepiej używać ArrayList.get() niż LinkedList.get() ? :)

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Dariusz Wawer:

Z innej beczki, w kwestii efektywności i kolekcji, przypomniała mi się kolejna oczywistość: dlaczego lepiej używać ArrayList.get() niż LinkedList.get() ? :)

Chyba nie do Ciebie (w sensie - nie do programisty) należy decyzja czy używać ArrayList.get() czy LinkedList.get() tylko raczej czy używać LinkedList czy ArrayList ?

Pytanie oczywiście samo w sobie jest błędne (albo raczej niepełne), bo odpowiedź zależy od kontekstu.

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Pawel Dolega:
Chyba nie do Ciebie (w sensie - nie do programisty) należy
decyzja czy używać ArrayList.get() czy LinkedList.get() tylko
raczej czy używać LinkedList czy ArrayList ?
Pytanie oczywiście samo w sobie jest błędne (albo raczej
niepełne), bo odpowiedź zależy od kontekstu.

To był skrót myślowy, nie wiem czy inni też mieli problemy ze zrozumieniem o co mi chodzi, jeśli tak - przepraszam.

Moje pytanie brzmiało: która implementacja listy jest lepsza jeśli chodzi o wykonywanie na niej operacji get(n), ArrayList czy LinkedList. No i ew. dlaczego.

Nie jestem też w stanie sobie wyobrazić kontekstu, w którym miałoby być odwrotnie. Możesz jakiś podać?

konto usunięte

Temat: [zagadka?] Avoid calling methods in conditions of for loops

Nie, nie jestem. Nie wydaje mi się żeby ktokolwiek miał problem z rozszyfrowaniem Twojego posta. Ja się po prostu perfidnie uczepiłem - myślałem, że pytanie będzie nieco bardziej interesujące jeśli porównać kiedy warto używać (i nie warto) ArrayList vs LinkedList.

Samo pytanie pozostawiam do rozwiązania innym aczkolwiek zakładam, że nie ma osoby na tym forum, która nie zna odpowiedzi.

Swoją drogą myślę, że ArrayList jest jedną z bardziej przereklamowanych klas - bardzo rzadko widuję, aby ktoś używał innej implementacji listy podczas gdy typowy use-case (powiedzmy 90%) to wrzucenie do listy niewiadomej ilości elementów i późniejsza iteracja po nich w kolejności dodania (najczęściej po wszystkich elementach).

pozdrawiamPawel Dolega edytował(a) ten post dnia 04.07.10 o godzinie 18:41

Następna dyskusja:

NX Client for Windows




Wyślij zaproszenie do