No Visual Basic, há uma diferença de desempenho ao usar a IIf
função em vez da If
instrução?
vb.net
if-statement
iif-function
Bryan Roth
fonte
fonte
IIf
.If
é muito mais eficiente do que aIIf
função.That's all you need to know, really
não parece uma atitude favorável para um site dedicado ao compartilhamento de conhecimento;)IIf()
executa o código verdadeiro e falso. Para coisas simples como atribuição numérica, isso não é grande coisa. Mas, para código que requer qualquer tipo de processamento, você está desperdiçando ciclos executando a condição que não corresponde e, possivelmente, causando efeitos colaterais.Ilustração de código:
Saídas:
fonte
Além disso, outro grande problema com o IIf é que ele realmente chamará quaisquer funções que estejam nos argumentos [1], portanto, se você tiver uma situação como a seguinte:
Na verdade, ele lançará uma exceção, que não é como a maioria das pessoas pensa que a função funciona na primeira vez que a vêem. Isso também pode levar a alguns bugs muito difíceis de corrigir em um aplicativo.
[1] Função IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
fonte
É melhor usar If em vez de IIf para usar o mecanismo de inferência de tipo corretamente (Opção Infer On)
Neste exemplo, palavras-chave são reconhecidas como uma string quando eu uso If:
Caso contrário, é reconhecido como um objeto:
fonte
De acordo com esse cara , IIf pode levar até 6x mais do que If / Then. YMMV.
fonte
Além disso, a legibilidade provavelmente deve ser mais altamente preferida do que o desempenho neste caso. Mesmo que o IIF fosse mais eficiente, é simplesmente menos legível para o público-alvo (suponho que se você estiver trabalhando em Visual Basic, você deseja que outros programadores sejam capazes de ler seu código facilmente, o que é o maior benefício do VB ... e que se perde com conceitos como IIF em minha opinião).
Além disso, "IIF é uma função, versus IF sendo parte da sintaxe das linguagens" ... o que implica para mim que, de fato, If seria mais rápido ... se por nada mais do que a instrução If pode ser reduzida diretamente para um pequeno conjunto de opcodes ao invés de ter que ir para outro espaço na memória para realizar a lógica encontrada na referida função. É uma diferença banal, talvez, mas vale a pena notar.
fonte
Acredito que a principal diferença entre If e IIf é:
Se (teste [boolean], instrução1, instrução2), significa que de acordo com o valor de teste ou satement1 ou instrução2 será executado (apenas uma instrução será executada)
Dim obj = IIF (test [boolean], instrução1, instrução2) significa que as duas instruções serão executadas, mas de acordo com o valor de teste, uma delas retornará um valor para (obj).
portanto, se uma das instruções lançar uma exceção, ela a lançará em (IIf) de qualquer maneira, mas em (If) ela a lançará apenas no caso de a condição retornar seu valor.
fonte
... por que pode demorar até 6x, quoth o wiki:
Essencialmente, IIf é o equivalente a um operador ternário em C ++ / C #, portanto, fornece algumas instruções do tipo if / else de 1 linha se você quiser. Você também pode atribuir a ele uma função para avaliar, se desejar.
fonte
Essas funções são diferentes! Talvez você só precise usar a instrução IF. IIF será sempre mais lento, porque fará as duas funções e fará a instrução IF padrão.
Se você está se perguntando por que existe a função IIF, talvez esta seja a explicação:
Portanto, o contador será 2 depois disso, mas s será apenas "SIM". Eu sei que essa coisa de contador é inútil, mas às vezes há funções que você precisará de ambas para executar, não importa se IF é verdadeiro ou falso, e apenas atribua o valor de uma delas à sua variável.
fonte
IIf()
dessa forma só vai confundir as pessoas que estão lendo seu código.