Разница в производительности между IIf () и If - PullRequest
98 голосов
/ 26 августа 2008

Есть ли разница в производительности в Visual Basic при использовании функции IIf вместо оператора If?

Ответы [ 9 ]

139 голосов
/ 26 августа 2008

VB имеет следующее If утверждение, к которому относится вопрос, я думаю:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

Первый - это в основном троичный условный оператор C #, а второй - его оператор объединения (возвращает result, если не Nothing, в этом случае возвращает "Alternative"). Таким образом, If заменил IIf, а последний устарел.

Как и в C #, условные операторские замыкания If в VB позволяют теперь безопасно написать следующее, что невозможно с помощью функции IIf:

Dim len = If(text Is Nothing, 0, text.Length)
64 голосов
/ 26 августа 2008

IIf() запускает как истинный, так и ложный код. Для простых вещей, таких как числовое назначение, это не имеет большого значения. Но для кода, который требует какой-либо обработки, вы теряете циклы, выполняя условие, которое не соответствует, и, возможно, вызывая побочные эффекты.

Иллюстрация кода:

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

Выходы:

Foo!
Bar!
13 голосов
/ 26 августа 2008

Кроме того, еще одна большая проблема с IIf состоит в том, что он будет фактически вызывать любые функции, которые находятся в аргументах [1], поэтому, если у вас есть ситуация, подобная следующей:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

Это на самом деле вызовет исключение, а не то, как большинство людей думает, что функция работает в первый раз, когда они ее видят. Это также может привести к очень сложным исправлениям ошибок в приложении.

[1] IIf Функция - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx

7 голосов
/ 22 сентября 2009

Лучше использовать, если вместо IIf правильно использовать механизм вывода типов (Option Infer On)

В этом примере Ключевые слова распознаются как строка, когда я использую If:

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

В противном случае он распознается как объект:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
6 голосов
/ 21 декабря 2009

Я считаю, что основное различие между If и IIf:

  • If (тест [логическое значение], оператор1, оператор2) это означает, что в соответствии с тестовым значением будет выполнено satement1 или Statement2. (будет выполняться только одна инструкция)

  • Dim obj = IIF (тест [логическое значение], оператор1, оператор2) это означает, что оба оператора будут выполнены, но согласно тестовому значению один из них вернет значение (obj).

поэтому, если одно из выражений сгенерирует исключение, оно все равно сгенерирует его в (IIf), но в (If) оно сгенерирует его на тот случай, если условие вернет его значение.

6 голосов
/ 26 августа 2008

Кроме того, в этом случае читаемость должна быть более предпочтительной, чем производительность. Даже если бы IIF был более эффективным, он просто менее читабелен для целевой аудитории (я полагаю, если вы работаете в Visual Basic, вы хотите, чтобы другие программисты могли легко читать ваш код, что является самым большим благом для VB ... и который потерян с понятиями как IIF по моему мнению).

Кроме того, "IIF - это функция, а если IF является частью синтаксиса языков" ... что означает для меня, что, действительно, If будет быстрее ... если ни для чего, кроме что оператор If можно свести непосредственно к небольшому набору кодов операций, вместо того, чтобы идти в другое место в памяти, чтобы выполнить логику, найденную в указанной функции. Возможно, это банальная разница, но стоит отметить.

6 голосов
/ 26 августа 2008

Согласно этому парню , IIf может занять до 6 раз больше, чем If / Then. YMMV.

5 голосов
/ 26 августа 2008

... о том, почему это может длиться до 6 раз, вики:

Поскольку IIf является библиотечной функцией, она всегда потребует накладных расходов вызов функции, тогда как условный Оператор будет скорее производить встроенный код.

По существу, IIf является эквивалентом тернарного оператора в C ++ / C #, поэтому он дает вам хорошую 1 строку операторов if / else типа, если вы этого хотите. Вы также можете дать ему функцию оценки, если хотите.

1 голос
/ 16 марта 2015

Эти функции разные! Возможно, вам нужно только использовать утверждение IF. IIF всегда будет медленнее, потому что он будет выполнять обе функции, плюс он будет выполнять стандартное выражение IF.

Если вам интересно, почему существует функция IIF, возможно, это будет объяснением:

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

Таким образом, счетчик будет равен 2 после этого, но s будет только «ДА». Я знаю, что этот счетчик бесполезен, но иногда есть функции, которые вам понадобятся для запуска, не имеет значения, является ли IF истинным или ложным, и просто присваивают значение одной из них вашей переменной.

...