Różnica wydajności między IIf () i If

W Visual Basic, czy istnieje różnica w wydajności przy użyciu funkcji IIf zamiast instrukcji If?

Author: emlai, 2008-08-26

9 answers

VB ma następującą wypowiedź If, do której odnosi się pytanie, myślę, że:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

Pierwszy jest w zasadzie trójwarstwowym operatorem warunkowym C#, a drugi operatorem coalesce (return result, chyba że jest to Nothing, w którym to przypadku return "Alternative"). If zastąpiła IIf i ta ostatnia jest przestarzała.

Podobnie jak w C#, VB jest operatorem warunkowym If, więc możesz teraz bezpiecznie napisać co następuje, co nie jest możliwe przy użyciu funkcji IIf:

Dim len = If(text Is Nothing, 0, text.Length)
 132
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-16 16:03:42

IIf() uruchamia zarówno kod true, jak i false. W przypadku prostych rzeczy, takich jak przypisanie liczbowe, nie jest to wielka sprawa. Ale w przypadku kodu, który wymaga jakiegokolwiek przetwarzania, marnujesz cykle, uruchamiając warunek, który nie pasuje, i prawdopodobnie powodując skutki uboczne.

Ilustracja kodu:

Module Module1
    Sub Main()
        Dim test As Boolean = False
        Dim result As String = IIf(test, Foo(), Bar())
    End Sub

    Public Function Foo() As String
        Console.WriteLine("Foo!")
        Return "Foo"
    End Function

    Public Function Bar() As String
        Console.WriteLine("Bar!")
        Return "Bar"
    End Function
End Module

Wyjścia:

Foo!
Bar!
 58
Author: Thomas G. Mayfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 09:39:27

Kolejnym dużym problemem z IIf jest to, że w rzeczywistości wywoła ona wszystkie funkcje znajdujące się w argumentach [1], więc jeśli masz następującą sytuację:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

To faktycznie rzuci wyjątek, co nie jest tak, jak większość ludzi myśli, że funkcja działa za pierwszym razem, gdy ją widzą. 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

 11
Author: rjzii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-26 15:43:59

Lepiej użyć If zamiast IIf, aby poprawnie użyć mechanizmu wnioskowania typu (opcja wnioskuj na)

W tym przykładzie słowa kluczowe są rozpoznawane jako ciąg znaków, gdy używam If:

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

W przeciwnym razie jest rozpoznawany jako obiekt:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
 7
Author: Larry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-22 12:45:28

Według tego faceta , IIf może trwać do 6x tak długo, jak If/Then. YMMV.

 6
Author: Greg Hurlman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-26 15:31:08

Poza tym czytelność powinna być prawdopodobnie bardziej preferowana niż wydajność w tym przypadku. Nawet jeśli IIF był bardziej wydajny, jest po prostu mniej czytelny dla grupy docelowej (zakładam, że jeśli pracujesz w Visual Basic, chcesz, aby inni programiści mogli łatwo odczytać kod, co jest największym dobrodziejstwem VB... i co jest stracone z pojęciami takimi jak IIF moim zdaniem).

Również "IIF jest funkcją, versus IF będącą częścią składni języków"... które sugeruje mi, że rzeczywiście, jeśli byłoby szybciej... if za nic poza tym, instrukcja If może być sprowadzona bezpośrednio do małego zestawu kodów opcodów, a nie musi iść do innego miejsca w pamięci, aby wykonać logikę znajdującą się we wspomnianej funkcji. Może to banalna różnica, ale warto zauważyć.

 6
Author: EdgarVerona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-26 15:37:33

Uważam, że główna różnica pomiędzy If I IIf wynosi:

  • If (test [boolean], statement1, statement2) oznacza to, że zgodnie z wartością testu wykonywany będzie satement1 lub statement2 (wykonamy tylko jedno polecenie)

  • Dim obj = IIF(test [boolean], statement1, statement2) to znaczy, że obie polecenia zostaną wykonane, ale według wartości testowej jedna z nich zwróci wartość do (obj).

Więc jeśli jedno ze stwierdzeń będzie throw an exception it will throw it in (IIF) anyway but in (If) it will throw it just in case the condition will return its value.

 6
Author: some guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-21 14:28:56

... co do tego, dlaczego może to trwać aż 6x, cytuję wiki:

Ponieważ IIf jest funkcją biblioteczną, to zawsze będzie wymagał napowietrznych wywołanie funkcji, natomiast warunkowe operator będzie bardziej prawdopodobne produkować kod inline.

Zasadniczo IIf jest odpowiednikiem operatora trójdzielnego w C++ / C#, więc daje Ci kilka ładnych 1 linii poleceń if/else, jeśli chcesz. Możesz również dać mu funkcję do oceny, jeśli chcesz.

 5
Author: Dillie-O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-26 15:34:48

Te funkcje są inne! Być może wystarczy użyć if statement. IIF zawsze będzie wolniejszy, ponieważ będzie wykonywał obie funkcje plus będzie wykonywał standardowe polecenie IF.

Jeśli zastanawiasz się, dlaczego istnieje funkcja IIF, może to będzie wyjaśnienie:

Sub main()
    counter = 0
    bln = True
    s = iif(bln, f1, f2)
End Sub

Function f1 As String
    counter = counter + 1
    Return "YES"
End Function

Function f2 As String
    counter = counter + 1
    Return "NO"
End Function

Więc licznik będzie 2 po tym, ale s będzie tylko "tak". Wiem, że ten licznik jest bezużyteczny, ale czasami są funkcje, które będą potrzebne zarówno do uruchomienia, nie ma znaczenia, czy jest to prawda czy fałsz, i po prostu przypisz wartość z jednego z nich do zmiennej.

 1
Author: titol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 19:54:19