En Visual Basic, ¿hay alguna diferencia de rendimiento cuando se usa la IIf
función en lugar de la If
instrucción?
vb.net
if-statement
iif-function
Bryan Roth
fuente
fuente
IIf
.If
es mucho más eficiente que laIIf
función.That's all you need to know, really
no suena como una actitud propicia para un sitio web dedicado al intercambio de conocimientos;)IIf()
ejecuta tanto el código verdadero como el falso. Para cosas simples como la asignación numérica, esto no es un gran problema. Pero para el código que requiere algún tipo de procesamiento, está desperdiciando ciclos ejecutando la condición que no coincide y posiblemente causando efectos secundarios.Ilustración de código:
Salidas:
fuente
Además, otro gran problema con el IIf es que realmente llamará a cualquier función que esté en los argumentos [1], así que si tienes una situación como la siguiente:
En realidad, lanzará una excepción, que no es la forma en que la mayoría de la gente cree que funciona la función la primera vez que la ve. Esto también puede llevar a algunos errores muy difíciles de corregir en una aplicación.
[1] Función IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
fuente
Es mejor usar If en lugar de IIf para usar el mecanismo de inferencia de tipos correctamente (Option Infer On)
En este ejemplo, las palabras clave se reconocen como una cadena cuando uso If:
De lo contrario, se reconoce como un objeto:
fuente
Según este tipo , IIf puede tardar hasta 6 veces más que If / Then. YMMV.
fuente
Además de eso, la legibilidad probablemente debería ser más preferida que el rendimiento en este caso. Incluso si IIF fuera más eficiente, simplemente es menos legible para el público objetivo (supongo que si está trabajando en Visual Basic, desea que otros programadores puedan leer su código fácilmente, que es la mayor ventaja de VB ... y que se pierde con conceptos como IIF en mi opinión).
Además, "IIF es una función, frente a SI es parte de la sintaxis de los lenguajes" ... lo que me implica que, de hecho, If sería más rápido ... si no fuera por otra cosa que la declaración If se puede resumir directamente a un pequeño conjunto de opcodes en lugar de tener que ir a otro espacio en la memoria para realizar la lógica encontrada en dicha función. Es una diferencia trivial, quizás, pero vale la pena señalarla.
fuente
Creo que la principal diferencia entre If y IIf es:
Si (prueba [booleano], sentencia1, sentencia2) significa que de acuerdo con el valor de prueba se ejecutará satement1 o sentencia2 (solo se ejecutará una sentencia)
Dim obj = IIF (test [boolean], statement1, statement2) significa que ambas sentencias se ejecutarán, pero de acuerdo con el valor de prueba, una de ellas devolverá un valor a (obj).
por lo que si una de las declaraciones arroja una excepción, la arrojará en (IIf) de todos modos, pero en (If) la arrojará en caso de que la condición devuelva su valor.
fuente
... en cuanto a por qué puede tardar hasta 6 veces, dice la wiki:
Básicamente, IIf es el equivalente de un operador ternario en C ++ / C #, por lo que le da algunas declaraciones de tipo if / else de 1 línea si lo desea. También puede darle una función para evaluar si lo desea.
fuente
¡Esas funciones son diferentes! Quizás solo necesite usar la instrucción IF. IIF siempre será más lento, porque hará ambas funciones y además hará la instrucción IF estándar.
Si se pregunta por qué existe la función IIF, tal vez esta sea una explicación:
Entonces, el contador será 2 después de esto, pero s será solo "SÍ". Sé que estas cosas del contador son inútiles, pero a veces hay funciones que necesitará ambas para ejecutar, no importa si IF es verdadero o falso, y simplemente asigne el valor de uno de ellos a su variable.
fuente
IIf()
de esta manera solo confundirá a las personas que lean su código.