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

95

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

Теги:
if-statement
iif-function

9 ответов

134
Лучший ответ

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)
  • 19
    Боже мой, редактировать обзор совершенно бесполезно. Анонимный редактор предложил редактирование, которое впоследствии было отклонено тремя рецензентами, даже если оно исправило ошибку в моем коде. Если вы читаете это, и вы были среди этих рецензентов: вы должны чувствовать себя плохо!
  • 0
    Вы не ответили на вопрос о производительности, а также не упомянули побочные эффекты IIf .
Показать ещё 8 комментариев
58

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!
10

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

  • 0
    Вот почему, если пришло время заменить старый IIF, у меня были проблемы с IIF, но IF сохранил, добавив много строк кода.
7

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

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

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

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

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

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

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

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

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

6

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

  • 1
    В моих эмпирических вычислениях (10000000 циклов) я оценивал, что если примерно в 12 раз медленнее!
6

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

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

5

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

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

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

1

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

  • 0
    если вам нужно запустить оба, вы должны явно вызвать их оба, а затем выполнить стандартное If. Использование IIf() таким образом может сбить с толку людей, читающих ваш код.
  • 0
    Я знаю это, но вопрос в разнице между этими двумя.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню