więc chcę użyć instrukcji switch takiej jak ta:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
Teraz wiem, że żadna z tych instrukcji ( <1000
) lub ( >1000 && <2000
) nie będzie działać (oczywiście z różnych powodów). Pytam o najbardziej efektywny sposób, aby to zrobić. Nienawidzę używać 30 if
instrukcji, więc wolałbym używać składni przełącznika. Czy mogę coś zrobić?
your_mapper_object[scrollLeft / SOME_CONST]
, zakładając, żeyour_mapper_object
coś takiego{1: some_func, 2: another_func, ...}
. W tym przypadku możesz również użyć przełącznika.Odpowiedzi:
Kiedy spojrzałem na rozwiązania w innych odpowiedziach, zobaczyłem pewne rzeczy, które, jak wiem, są złe dla wydajności. Zamierzałem zamieścić je w komentarzu, ale pomyślałem, że lepiej będzie go porównać i podzielić się wynikami. Możesz to przetestować sam . Poniżej znajdują się moje wyniki (ymmv) znormalizowane po najszybszej operacji w każdej przeglądarce (pomnóż czas 1,0 przez znormalizowaną wartość, aby uzyskać czas bezwzględny w ms).
Testuj w systemie Windows 7 32bit z następującymi wersjami: Chrome 21.0.1180.89m , Firefox 15.0 , Opera 12.02 , MSIE 9.0.8112 , Safari 5.1.7 . Węzeł został uruchomiony na 64-bitowym systemie Linux, ponieważ rozdzielczość czasomierza w Node.js dla Windows wynosiła 10 ms zamiast 1 ms.
jeśli-natychmiast
Jest to najszybszy we wszystkich testowanych środowiskach, z wyjątkiem ... drumroll MSIE! (niespodzianka niespodzianka). Jest to zalecany sposób na jego wdrożenie.
jeśli-pośredni
Jest to wariant
switch-indirect-array
zif
opcją -statements i działa znacznie szybciej niżswitch-indirect-array
w prawie wszystkich testowanych środowiskach.natychmiastowa zmiana
Jest to dość szybkie we wszystkich testowanych środowiskach i faktycznie najszybsze w MSIE. Działa, gdy można wykonać obliczenia w celu uzyskania indeksu.
zakres przełączania
Jest to około 6 do 40 razy wolniejsze niż najszybsze we wszystkich testowanych środowiskach, z wyjątkiem Opery, gdzie zajmuje to około półtora raza dłużej. Jest powolny, ponieważ silnik musi porównać wartość dwukrotnie dla każdego przypadku. Zaskakujące jest to, że Chrome zajmuje prawie 40 razy dłużej, niż w przypadku najszybszej operacji w Chrome, podczas gdy MSIE zajmuje tylko 6 razy dłużej. Ale rzeczywista różnica czasu wynosiła tylko 74 ms na korzyść MSIE przy 1337 ms (!).
zakres przełączania 2
Jest to wariant,
switch-range
ale z jednym porównaniem na skrzynkę, a zatem szybszy, ale wciąż bardzo wolny, z wyjątkiem Opery. Kolejność instrukcji case jest ważna, ponieważ silnik przetestuje każdą sprawę w kolejności kodu źródłowego ECMAScript262: 5 12.11tablica przełączania pośredniego
W tym wariancie zakresy są przechowywane w tablicy. Jest to powolne we wszystkich testowanych środowiskach i bardzo wolno w Chrome.
tablicowo-liniowe wyszukiwanie
Jest to kombinacja liniowego wyszukiwania wartości w tablicy i instrukcji switch ze stałymi wartościami. Powodem, dla którego warto to wykorzystać, jest fakt, że wartości nie są znane do czasu uruchomienia. Jest wolny w każdym testowanym środowisku i zajmuje prawie 10 razy więcej czasu w MSIE.
switch-binary-switch
Jest to wariant
array-linear-switch
z wyszukiwaniem binarnym. Niestety jest wolniejszy niż wyszukiwanie liniowe. Nie wiem, czy to moja implementacja, czy też wyszukiwanie liniowe jest bardziej zoptymalizowane. Możliwe też, że przestrzeń na klucze jest za mała.Wniosek
Jeśli wydajność jest ważna, użyj
if
-statements lubswitch
z natychmiastowymi wartościami.źródło
Alternatywa:
Demo: http://jsfiddle.net/UWYzr/
źródło
if(...) else if(...)
? Pozwala to uniknąć,if
ale nie wydaje mi się, że jest to całkiem zamiennik.if
-statements. Zobacz moją odpowiedź tutajDziała tylko, jeśli masz regularne kroki ...
EDYCJA: ponieważ to rozwiązanie wciąż zyskuje na popularności, muszę doradzić, że rozwiązanie mofolo jest o wiele lepsze
źródło
Math.round(scrollLeft/1000)
drogą.Możesz utworzyć niestandardowy obiekt z kryteriami i funkcją odpowiadającą tym kryteriom
Zdefiniuj funkcje dla tego, co chcesz zrobić w tych przypadkach (zdefiniuj funkcję 1, funkcję 2 itd.)
I „oceniaj” zasady
Uwaga
Wiele razy, jeśli wyciągi są łatwiejsze do odczytania i utrzymania. Poleciłbym powyższe tylko wtedy, gdy masz wiele warunków i możliwość dużego wzrostu w przyszłości.
Aktualizacja
Jak zauważył @Brad w komentarzach, jeśli warunki wykluczają się wzajemnie (tylko jeden z nich może być spełniony jednocześnie), sprawdzenie górnej granicy powinno wystarczyć:
pod warunkiem, że warunki są zdefiniowane w porządku rosnącym (najpierw najniższy
0 to 1000
, a następnie1000 to 2000
na przykład)źródło
action=function1
- czy to nie powinny być dwukropki? ;-) - Możesz również zmienić to tak, aby mieć tylko górną granicę, ponieważ ze względu na proces eliminacji nie możesz należeć do dwóch grup - chyba że taki był twój zamiar (aby możliwe było wiele działań).Co dokładnie robisz
//do stuff
?Możesz być w stanie zrobić coś takiego:
źródło
Nie sprawdzone i niepewne, czy to zadziała, ale dlaczego nie zrobić kilku
if statements
wcześniej, aby ustawić zmienne dlaswitch statement
.źródło
To kolejna opcja:
źródło
Aktualizacja zaakceptowanej odpowiedzi (nie można jeszcze komentować). Począwszy od 1/12/16 przy użyciu demo jsfiddle w chrome, natychmiastowe przełączanie jest najszybszym rozwiązaniem.
Wyniki: Rozdzielczość czasowa: 1,33
Skończone
źródło
W moim przypadku (kodowanie kolorami w procentach, nic krytycznego dla wydajności) szybko napisałem:
źródło
Ostatnio miałem tę samą sytuację, tak to rozwiązałem:
przed:
po:
A jeśli ustawisz „1, 2, 3, 4, 5”, może to być jeszcze prostsze:
źródło