Gibt es in Visual Basic einen Leistungsunterschied, wenn die IIf
Funktion anstelle der If
Anweisung verwendet wird?
vb.net
if-statement
iif-function
Bryan Roth
quelle
quelle
IIf
.If
effizienter als dieIIf
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:
Ausgänge:
quelle
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:
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
quelle
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:
Andernfalls wird es als Objekt erkannt:
quelle
Laut diesem Typen kann IIf bis zu 6x so lange dauern wie If / Then. YMMV.
quelle
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.
quelle
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.
quelle
... warum es bis zu 6x dauern kann, sagt das Wiki:
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.
quelle
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:
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.
quelle
IIf()
auf diese Weise wird nur die Leute verwirren, die Ihren Code lesen.