Leistungsunterschied zwischen IIf() und If
-
09-06-2019 - |
Frage
Gibt es in Visual Basic einen Leistungsunterschied bei der Verwendung von? IIf
Funktion anstelle der If
Stellungnahme?
Lösung
VB hat Folgendes If
Aussage, auf die sich die Frage bezieht, denke ich:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Der erste ist im Grunde der ternäre Bedingungsoperator von C# und der zweite ist der Koaleszenzoperator (return). result
es sei denn, es ist so Nothing
, in diesem Fall zurückkehren "Alternative"
). If
hat somit ersetzt IIf
und Letzteres ist veraltet.
Wie in C# ist VB bedingt If
Operator-Kurzschlüsse, so dass Sie jetzt sicher Folgendes schreiben können, was mit dem nicht möglich ist IIf
Funktion:
Dim len = If(text Is Nothing, 0, text.Length)
Andere Tipps
IIf()
führt sowohl den wahren als auch den falschen Code aus.Für einfache Dinge wie numerische Zuweisungen ist das keine große Sache.Bei Code, der irgendeine Art von Verarbeitung erfordert, verschwenden Sie jedoch Zyklen, in denen die Bedingung ausgeführt wird, die nicht übereinstimmt, was möglicherweise zu Nebenwirkungen führt.
Code-Abbildung:
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
Ausgänge:
Foo!
Bar!
Ein weiteres großes Problem mit IIf besteht darin, dass es tatsächlich alle Funktionen aufruft, die in den Argumenten [1] enthalten sind. Wenn Sie also eine Situation wie die folgende haben:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
Es wird tatsächlich eine Ausnahme ausgelöst, was die meisten Leute nicht glauben, dass die Funktion funktioniert, wenn sie sie zum ersten Mal sehen.Dies kann auch zu einigen sehr schwer zu behebenden Fehlern in einer Anwendung führen.
[1] IIf-Funktion - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Verwenden Sie besser If anstelle von IIf, um den Typinferenzmechanismus korrekt zu verwenden (Option Infer On).
In diesem Beispiel wird Keywords als Zeichenfolge erkannt, wenn ich If verwende:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Andernfalls wird es als Objekt erkannt:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Entsprechend dieser Typ, IIf kann bis zu 6x so lange dauern wie If/Then.YMMV.
Darüber hinaus sollte in diesem Fall wahrscheinlich die Lesbarkeit höher sein als die Leistung.Selbst wenn IIF effizienter wäre, ist es für die Zielgruppe einfach weniger lesbar (ich gehe davon aus, dass Sie, wenn Sie in Visual Basic arbeiten, möchten, dass andere Programmierer Ihren Code leicht lesen können, was der größte Vorteil von VB ist ...und was meiner Meinung nach bei Konzepten wie IIF verloren geht).
Auch, „IIF ist eine Funktion, während IF Teil der Syntax der Sprachen ist“...was für mich impliziert, dass If tatsächlich schneller wäre ...Aus diesem Grund kann die If-Anweisung direkt auf einen kleinen Satz von Opcodes reduziert werden, anstatt an einen anderen Speicherort gehen zu müssen, um die in der Funktion enthaltene Logik auszuführen.Es ist vielleicht ein banaler Unterschied, aber erwähnenswert.
Ich glaube, dass der Hauptunterschied zwischen If und IIf darin besteht:
If (test [boolean], Erklärung1, Anweisung2) bedeutet, dass nach dem Testwert Satement1 oder Anweisung2 ausgeführt wird (nur eine Anweisung wird ausgeführt)
Dim Obj = IIF (Test [boolean], Anweisung1, Anweisung2). Es bedeutet, dass beide Aussagen ausgeführt werden, aber gemäß dem Testwert einer von ihnen wird einen Wert an (OBJ) zurückgeben.
Wenn also eine der Anweisungen eine Ausnahme auslöst, wird sie diese trotzdem in (IIf) auslösen, in (If) jedoch nur für den Fall, dass die Bedingung ihren Wert zurückgibt.
...warum es bis zu 6x dauern kann, sagt das Wiki:
Da IIF eine Bibliotheksfunktion ist, erfordert es immer den Overhead eines Funktionsaufrufs, während ein bedingter Bediener eher einen Inline -Code erzeugt.
Im Wesentlichen ist IIf das Äquivalent eines ternären Operators in C++/C#, sodass Sie bei Bedarf einige nette einzeilige if/else-Anweisungen erhalten.Sie können ihm bei Bedarf auch eine Funktion zur Auswertung zuweisen.
Diese Funktionen sind unterschiedlich!Möglicherweise müssen Sie nur die IF-Anweisung verwenden.IIF wird immer langsamer sein, da es beide Funktionen ausführt und zusätzlich die Standard-IF-Anweisung ausführt.
Wenn Sie sich fragen, warum es die IIF-Funktion gibt, finden Sie hier möglicherweise eine Erklärung:
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
Der Zähler wird danach also 2 sein, aber s wird nur „JA“ sein.Ich weiß, dass dieses Zählerzeug nutzlos ist, aber manchmal gibt es Funktionen, für deren Ausführung Sie beide Funktionen benötigen, unabhängig davon, ob IF wahr oder falsch ist, und der Variablen einfach den Wert einer dieser Funktionen zuweisen.