Wpis z mikrobloga

@Marmite: Ale co masz na myśli, bo nie bardzo rozumiem :D Podaj może jakiś przykład, w którym przerwanie pętli for po znalezieniu szukanego elementu jest gorsze od przeszukania całej tablicy, bo ja raczej nie potrafię sobie takiego wyobrazić.
@sarveniusz: Ogólnie powinno się unikać instrukcji warunkowych w programowaniu ze względu na coś takiego jak pipelining w procesorze. Załóżmy przykładowo że masz 5 elementów do przeszukania, procesor sobie już wczyta wszystkie instrukcje do pipe'a i nie będzie potrzeby wycofywać żadnej z nich i zajmie to X milisekund. A w twoim przypadku może się okazać że element zostanie znaleziony więc zamiast przechodzić do następnego elementu trzeba będzie nagle zrobić return - a
@Marmite:

Ogólnie powinno się unikać instrukcji warunkowych w programowaniu

ze względu na coś takiego jak pipelining w procesorze


Patrząc już pod kątem optymalizacyjnym to niekoniecznie unikać, ale powodować by heurystyka działała jak najlepiej. Skoro i tak wyjście z pętli będzie cache missem to optymalniej jest zrobić for(...) {} w którym wszystkie elementy będą trafiały w cache (isFree() == false) oprócz tego jednego elementu po którym zrobimy return i zdejmiemy funkcje ze
@larvaexotech: Wszystko spoko, ale jaki jest cel rozważania takich rzeczy, kiedy liczba elementów jest na tyle mała, że nie powoduje zauważalnych spadków/wzrostów wydajności... Jakby tam było miliard elementów to jest pole do optymalizacji, a jak jest ich 10 to szczerze mówiąc nie ma to sensu.

algorytm kolegi ma złożoność od O(1) do O(n) natomiast Twój to zawsze O(n)

Z reguły i tak bierze się pod uwagę pesymistyczną złożonośc, więc oba mają
@Marmite: Nie ma to żadnego sensu, szczególnie jeśli mówimy o javascripcie więc istnieje pierdyliard różnych innych narzutów wydajnościowych przy których sens tej dyskusji jest jeszcze mniejszy :)

Tak więc już bardziej praktycznie, pomijając kwestie wydajności, to gdy natrafisz na taką sytuację to zamiast filter prościej jest użyć czytelniejszego algorytmu:

let emptyRoom = rooms.find( r => r.isEmpty() );

https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/find