Gibt es in Visual Basic einen Leistungsunterschied, wenn die IIf
Funktion anstelle der If
Anweisung verwendet wird?
Gibt es in Visual Basic einen Leistungsunterschied, wenn die IIf
Funktion anstelle der If
Anweisung verwendet wird?
Antworten:
VB hat die folgende 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 bedingte Operator von C # und der zweite ist der Koaleszenzoperator (return, es result
sei denn, dies ist Nothing
der Fall "Alternative"
). If
hat somit ersetzt IIf
und letzteres ist veraltet.
Wie in C # schließt der bedingte If
Operator von VB kurz, sodass Sie jetzt sicher Folgendes schreiben können, was mit der IIf
Funktion nicht möglich ist:
Dim len = If(text Is Nothing, 0, text.Length)
If
effizienter als die IIf
Funktion.
That's all you need to know, really
klingt nicht nach einer förderlichen Einstellung für eine Website, die sich dem Wissensaustausch widmet;)
IIf()
führt sowohl den wahren als auch den falschen Code aus. Für einfache Dinge wie die numerische Zuweisung ist dies keine große Sache. Bei Code, der eine Verarbeitung erfordert, verschwenden Sie jedoch Zyklen, in denen die nicht übereinstimmende Bedingung ausgeführt wird, und verursachen möglicherweise Nebenwirkungen.
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 dem IIf ist, 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 auslösen, so wie die meisten Leute nicht denken, dass die Funktion funktioniert, wenn sie sie zum ersten Mal sehen. Dies kann auch zu sehr schwer zu behebenden Fehlern in einer Anwendung führen.
[1] IIf-Funktion - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Besser verwenden If anstelle von IIf, um den Typinferenzmechanismus korrekt zu verwenden (Option Infer On)
In diesem Beispiel werden Schlüsselwörter als Zeichenfolge erkannt, wenn ich If:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Andernfalls wird es als Objekt erkannt:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Laut diesem Typen kann IIf bis zu 6x so lange dauern wie If / Then. YMMV.
Darüber hinaus sollte in diesem Fall die Lesbarkeit wahrscheinlich stärker bevorzugt werden als die Leistung. Selbst wenn IIF effizienter war, ist es für die Zielgruppe einfach weniger lesbar (ich nehme an, wenn Sie in Visual Basic arbeiten, möchten Sie, dass andere Programmierer Ihren Code leicht lesen können, was der größte Segen von VB ist ... und was meiner Meinung nach mit Konzepten wie IIF verloren geht).
Außerdem ist "IIF eine Funktion, wenn IF Teil der Sprachsyntax ist" ... was für mich impliziert, dass If in der Tat schneller wäre ... wenn für nichts anderes als das die If-Anweisung direkt heruntergekocht werden kann zu einem kleinen Satz von Opcodes, anstatt zu einem anderen Speicherplatz gehen zu müssen, um die in dieser Funktion gefundene Logik auszuführen. Es ist vielleicht ein kleiner Unterschied, aber erwähnenswert.
Ich glaube, dass der Hauptunterschied zwischen If und IIf ist:
Wenn (test [boolean], Anweisung1, Anweisung2) bedeutet dies, dass gemäß dem Testwert entweder satement1 oder Anweisung2 ausgeführt wird (nur eine Anweisung wird ausgeführt).
Dim obj = IIF (test [boolean], Anweisung1, Anweisung2) bedeutet, dass beide Anweisungen ausgeführt werden, aber gemäß dem Testwert eine von ihnen einen Wert an (obj) zurückgibt.
Wenn also eine der Anweisungen eine Ausnahme auslöst, wird sie trotzdem in (IIf) ausgelöst, aber in (If) wird sie ausgelöst, nur für den Fall, dass die Bedingung ihren Wert zurückgibt.
... warum es bis zu 6x dauern kann, sagt das Wiki:
Da es sich bei IIf um eine Bibliotheksfunktion handelt, ist immer der Overhead eines Funktionsaufrufs erforderlich, während ein bedingter Operator mit größerer Wahrscheinlichkeit Inline-Code erzeugt.
Im Wesentlichen entspricht IIf einem ternären Operator in C ++ / C #, sodass Sie einige nette 1-zeilige if / else-Typanweisungen erhalten, wenn Sie dies möchten. Sie können ihm auch eine Funktion geben, um zu bewerten, ob Sie dies wünschen.
Diese Funktionen sind unterschiedlich! Möglicherweise müssen Sie nur die IF-Anweisung verwenden. IIF ist immer langsamer, da es beide Funktionen und die Standard-IF-Anweisung ausführt.
Wenn Sie sich fragen, warum es eine IIF-Funktion gibt, ist dies 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
Danach ist der Zähler 2, aber s ist nur "JA". Ich weiß, dass dieses Zählermaterial nutzlos ist, aber manchmal gibt es Funktionen, die Sie beide ausführen müssen, egal ob IF wahr oder falsch ist, und weisen Sie Ihrer Variablen einfach einen Wert von einer davon zu.
IIf()
auf diese Weise wird nur die Leute verwirren, die Ihren Code lesen.
IIf
.