Chłopaki mam kilka pytań:
- Czy istnieje różnica wydajności w JavaScript między
switch
instrukcją a instrukcjąif...else
? - Jeśli tak, dlaczego?
- Czy zachowanie
switch
i jestif...else
różne w różnych przeglądarkach? (FireFox, IE, Chrome, Opera, Safari)
Powodem zadawania tego pytania jest to, że wydaje mi się, że osiągam lepszą wydajność na switch
wyciągu z około 1000 przypadków w przeglądarce Firefox.
Edytowane Niestety to nie jest mój kod, Javascript jest tworzony na serwerze poza skompilowaną biblioteką i nie mam dostępu do kodu. Wywoływana jest metoda, która tworzy skrypt javascript
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
uwaga arrayofvalues
jest listą oddzieloną przecinkami.
to, co produkuje
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Uwaga: gdzie [name]
= nazwa przekazana do funkcji po stronie serwera
Teraz zmieniłem dane wyjściowe funkcji, która ma być wstawiona do TextArea, napisałem kod JavaScript do analizy funkcji i przekonwertowałem go na zestaw case
instrukcji.
wreszcie uruchamiam tę funkcję i działa dobrze, ale wydajność różni się w IE i Firefox.
źródło
Odpowiedzi:
Odpowiedzi ogólnie:
Strona testowa
źródło
switch
iif/then
w JS. W artykule stwierdzono, że jest to spowodowane nieregularnąswitch
optymalizacją i różnymi sposobami działania różnych silników JS. Cytat:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
Czasami lepiej nie używać żadnego. Na przykład w sytuacji „wysyłki” Javascript pozwala robić rzeczy w zupełnie inny sposób:
Konfigurowanie rozgałęzień wielotorowych poprzez utworzenie obiektu ma wiele zalet. Możesz dynamicznie dodawać i usuwać funkcje. Możesz utworzyć tabelę wysyłki na podstawie danych. Możesz to sprawdzić programowo. Możesz zbudować programy obsługi z innymi funkcjami.
Istnieje dodatkowy narzut wywołania funkcji, aby uzyskać odpowiednik „przypadku”, ale zaleta (gdy jest wiele przypadków) wyszukiwania skrótu w celu znalezienia funkcji dla określonego klucza.
źródło
Różnica w wydajności między a
switch
iif...else if...else
jest niewielka, w zasadzie wykonują tę samą pracę. Jedyną różnicą między nimi, która może mieć znaczenie, jest to, że wyrażenie do testowania jest oceniane tylko raz na jakiśswitch
czas, jest oceniane dla każdegoif
. Jeśli oszacowanie wyrażenia jest kosztowne, zrobienie tego raz jest oczywiście szybsze niż zrobienie tego sto razy.Różnica w implementacji tych poleceń (i ogólnie wszystkich skryptów) różni się znacznie między przeglądarkami. Często spotyka się dość duże różnice w wydajności tego samego kodu w różnych przeglądarkach.
Ponieważ trudno jest przetestować wydajność całego kodu we wszystkich przeglądarkach, powinieneś wybrać kod, który najlepiej pasuje do tego, co robisz, i spróbować zmniejszyć ilość wykonywanej pracy, zamiast optymalizować sposób jej wykonywania.
źródło
Zasadniczo używaj tego, co sprawia, że kod jest najbardziej czytelny. Zdecydowanie są miejsca, w których jedna lub druga konstrukcja zapewnia czystszą, czytelniejszą i łatwiejszą w utrzymaniu. Jest to o wiele ważniejsze niż zaoszczędzenie kilku nanosekund w kodzie JavaScript.
źródło
if..else
iswitch
spowodowane przez unikalną kombinację sprzętu komputerowego przeglądarki i systemu operacyjnego.Inaczej niż składnia, przełącznik można zaimplementować za pomocą drzewa, które go tworzy
O(log n)
, podczas gdy if / else musi zostać zaimplementowane zO(n)
podejściem proceduralnym. Częściej oba są przetwarzane proceduralnie, a jedyną różnicą jest składnia, a ponadto czy to naprawdę ma znaczenie - chyba że wpisujesz statycznie 10 tys. Przypadków if / else?źródło
Odpowiedź Pointy'ego sugeruje użycie dosłownego obiektu jako alternatywy dla
switch
lubif
/else
. To podejście też mi się podoba, ale kod w odpowiedzi tworzy nowymap
obiekt za każdym razem, gdydispatch
funkcja jest wywoływana:Jeśli
map
zawiera dużą liczbę wpisów, może to spowodować znaczne obciążenie. Mapę akcji lepiej ustawić tylko raz, a następnie za każdym razem korzystać z już utworzonej mapy, na przykład:źródło
Nie sądzę,
switch
jest przydatne / krótkie, jeśli chcesz zapobiec wieluif-else
warunkom.Zachowanie jest takie samo we wszystkich przeglądarkach :)
źródło
switch is useful/short if you want prevent multiple if-else conditions.
Tak proszę pana, świetny post.źródło
Okazuje się, że jeśli - inaczej, generalnie szybciej niż przełącznik
http://jsperf.com/switch-if-else/46
źródło