Differenza di prestazioni tra la funzione IIf() e Se
-
09-06-2019 - |
Domanda
In Visual Basic, c'è una differenza di prestazioni quando si utilizza il IIf
invece la funzione If
dichiarazione?
Soluzione
VB è il seguente If
dichiarazione che la domanda si riferisce, credo che:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Il primo è fondamentalmente C#'s operatore condizionale ternario e il secondo è il suo fondersi operatore (ritorno result
a meno che non Nothing
, in caso di ritorno "Alternative"
). If
ha così sostituito IIf
e quest'ultimo è obsoleti.
Come in C#, VB condizionale If
operatore di corto-circuiti, quindi si può tranquillamente scrivere il seguito, che non è possibile usare IIf
funzione:
Dim len = If(text Is Nothing, 0, text.Length)
Altri suggerimenti
IIf()
funziona sia il vero e il falso codice.Per le cose semplici, come quelli numerici di assegnazione, questo non è un grosso problema.Ma per il codice richiede qualsiasi tipo di lavorazione, stai sprecando i cicli di esecuzione condizione che non corrisponde, e possibilmente causare effetti collaterali.
Codice illustrazione:
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
Uscite:
Foo!
Bar!
Inoltre, un altro grosso problema con la IIf è che effettivamente chiamata a funzioni che sono in argomenti [1], in modo che se una situazione come la seguente:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
Effettivamente lanciare un'eccezione, che non è come la maggior parte della gente pensa la funzione funziona la prima volta che lo vedono.Questo può anche portare a molto duro per risolvere i bug di un'applicazione.
[1] Funzione IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Utilizzare meglio Se invece di IIf utilizzare il tipo di inferenza meccanismo correttamente (Option Infer)
In questo esempio, le parole chiave, è riconosciuta come una stringa quando uso Se :
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
In caso contrario, è riconosciuto come Oggetto :
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Secondo questo ragazzo, IIf può richiedere fino a 6x, come lungo come Se/Allora.YMMV.
In cima a quello, la leggibilità, probabilmente, dovrebbe essere più altamente preferito di prestazioni in questo caso.Anche se IIF era più efficiente, è semplicemente meno leggibile per il target di riferimento (presumo che se si sta lavorando in Visual Basic, si desidera che altri programmatori per essere in grado di leggere il codice facilmente, VB grande vantaggio...e che è andata persa con concetti come IIF a mio parere).
Inoltre, "IIF è una funzione, e SE essere parte delle lingue "sintassi"...il che implica, per me, che, anzi, Se sarebbe più veloce...se per altro non è che che Se la dichiarazione può essere bollito giù direttamente a un piccolo set di istruzioni, piuttosto che dover andare in un altro spazio in memoria per eseguire la logica in tale funzione.Si tratta di un banale differenza, forse, ma vale la pena notare.
Credo che la differenza principale tra Se e IIf è:
Se(test [boolean], statement1, statement2) significa che, secondo il valore di prova sia satement1 o statement2 verrà eseguito (una sola istruzione execute)
Dim obj = IIF(test [boolean] , statement1, statement2) significa che entrambe le affermazioni eseguirà ma secondo valore di prova uno di loro verrà restituito un valore (obj).
quindi, se una delle dichiarazioni genererà un'eccezione rimette in (IIf) in ogni caso, ma (Se) sarà gettarlo nel caso in cui la condizione di restituire il suo valore.
...perché può richiedere fino a 6x, disse la wiki:
Perché Se è una funzione di libreria, si sempre richiedono l'overhead di un chiamata di funzione, mentre un condizionale l'operatore ha più probabilità di produrre codice inline.
Essenzialmente IIf è l'equivalente di un operatore ternario in C++/C#, in modo che ti dà un bel 1 riga if/else istruzioni di tipo se ti va.Si può anche dare una funzione per valutare se il desiderio.
Tali funzioni sono diverse!Forse hai solo bisogno di utilizzare istruzione IF.IIF sarà sempre più lento, perché le due funzioni in più non farà standard in CASO di dichiarazione.
Se vi state chiedendo perché c'è la funzione IIF, forse questa sarà la spiegazione:
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
Così il contatore 2 dopo questo, ma la volontà di essere "SÌ".So che questo contatore è roba inutile, ma a volte ci sono funzioni che è necessario sia per l'esecuzione, non importa se è vero o falso, e basta assegnare un valore da uno di loro al variabile.