Czy w języku Visual Basic występuje różnica w wydajności w przypadku używania IIf
funkcji zamiast If
instrukcji?
vb.net
if-statement
iif-function
Bryan Roth
źródło
źródło
IIf
.If
jest znacznie wydajniejszy niżIIf
funkcja.That's all you need to know, really
nie brzmi jak sprzyjająca postawa dla strony poświęconej dzieleniu się wiedzą;)IIf()
uruchamia zarówno kod prawda, jak i fałsz. W przypadku prostych rzeczy, takich jak przypisanie numeryczne, nie jest to wielka sprawa. Ale w przypadku kodu, który wymaga jakiegokolwiek przetwarzania, marnujesz cykle uruchamiające niezgodny warunek i prawdopodobnie powodując efekty uboczne.Ilustracja kodu:
Wyjścia:
źródło
Kolejnym dużym problemem związanym z IIf jest to, że faktycznie wywoła on wszystkie funkcje, które znajdują się w argumentach [1], więc jeśli masz sytuację podobną do poniższej:
W rzeczywistości zgłosi wyjątek, co nie jest sposobem, w jaki większość ludzi myśli, że funkcja działa, gdy ją widzą po raz pierwszy. Może to również prowadzić do bardzo trudnych do naprawienia błędów w aplikacji.
[1] Funkcja IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
źródło
Lepiej używać If zamiast IIf, aby poprawnie używać mechanizmu wnioskowania o typie (Option Infer On)
W tym przykładzie słowa kluczowe są rozpoznawane jako ciąg, gdy używam If:
W przeciwnym razie jest rozpoznawany jako obiekt:
źródło
Według tego gościa , IIf może trwać do 6 razy dłużej niż If / Then. YMMV.
źródło
Ponadto w tym przypadku czytelność powinna być prawdopodobnie bardziej preferowana niż wydajność. Nawet jeśli IIF byłby bardziej wydajny, jest po prostu mniej czytelny dla docelowych odbiorców (zakładam, że jeśli pracujesz w Visual Basic, chcesz, aby inni programiści mogli łatwo czytać twój kod, co jest największym dobrodziejstwem VB ... i co moim zdaniem jest stracone w przypadku pojęć takich jak IIF).
Ponadto „IIF jest funkcją, w przeciwieństwie do funkcji IF będącej częścią składni języków” ... co oznacza dla mnie, że rzeczywiście, jeśli byłoby szybsze ... gdyby nie nic innego, jak tylko to, że instrukcja If może być bezpośrednio sprowadzona do małego zestawu rozkazów, zamiast konieczności przechodzenia do innego miejsca w pamięci, aby wykonać logikę znalezioną we wspomnianej funkcji. Może to banalna różnica, ale warto ją zauważyć.
źródło
Uważam, że główna różnica między If i IIf to:
Jeśli (test [boolean], instrukcja1, instrukcja2) oznacza to, że zgodnie z wartością testu zostanie wykonana satement1 lub instrukcja2 (zostanie wykonana tylko jedna instrukcja)
Dim obj = IIF (test [boolean], instrukcja1, instrukcja2) oznacza to, że obie instrukcje zostaną wykonane, ale zgodnie z wartością testową jedna z nich zwróci wartość do (obj).
więc jeśli jedna z instrukcji zgłosi wyjątek, i tak wyrzuci ją w (IIf), ale w (If) wyrzuci ją na wypadek, gdyby warunek zwrócił jego wartość.
źródło
... dlaczego może to potrwać tak długo, jak 6x, powiedz wiki:
Zasadniczo IIf jest odpowiednikiem operatora trójskładnikowego w C ++ / C #, więc daje ci kilka ładnych instrukcji typu if / else, jeśli chcesz. Możesz również nadać mu funkcję oceny, jeśli chcesz.
źródło
Te funkcje są różne! Być może wystarczy użyć instrukcji IF. Funkcja IIF zawsze będzie wolniejsza, ponieważ będzie wykonywać obie funkcje, a ponadto wykona standardową instrukcję IF.
Jeśli zastanawiasz się, dlaczego istnieje funkcja IIF, może to będzie wyjaśnienie:
Tak więc licznik po tym będzie wynosił 2, ale s będzie tylko „TAK”. Wiem, że ten licznik jest bezużyteczny, ale czasami są funkcje, które będziesz potrzebować do uruchomienia obu, nie ma znaczenia, czy to prawda, czy fałsz, i po prostu przypisz wartość jednej z nich do swojej zmiennej.
źródło
IIf()
w ten sposób zmyli ludzi czytających Twój kod.