Разница в производительности между IIf() и If

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

Ответ 1

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

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

Первый - это, в основном, термальный условный оператор С#, а второй - его оператор коалесценции (return result, если только его Nothing, и в этом случае return "Alternative"). If, таким образом, заменил IIf, а последний устарел.

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

Dim len = If(text Is Nothing, 0, text.Length)

Ответ 2

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!

Ответ 3

Кроме того, другая важная проблема с 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

Ответ 4

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

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

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

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

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

Ответ 5

В соответствии с этот парень, IIf может занимать до 6 раз до тех пор, пока If/Then. YMMV.

Ответ 6

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

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

Ответ 7

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

  • Если (test [boolean], statement1, statement2) это означает, что в соответствии с тестовым значением выполняется либо satement1, либо statement2 (выполняется только один оператор)

  • Dim obj = IIF (test [boolean], statement1, statement2) это означает, что оба оператора будут выполняться, но в соответствии с тестовым значением один из них вернет значение (obj).

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

Ответ 8

... о том, почему это может занять до 6x, процитировать wiki:

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

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

Ответ 9

Эти функции разные! Возможно, вам нужно только использовать инструкцию 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 истинным или ложным и просто присваивает значение одной из них вашей переменной.