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

в Visual Basic есть ли разница в производительности при использовании вместо If заявление?

9 ответов


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

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

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

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

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

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

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

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!

кроме того, еще одна большая проблема с 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


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

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

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

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

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

по данным этот парень, Ииф может принять до 6кс покуда если / после этого. YMMV.


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

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


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

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

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

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


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

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

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


эти функции разные! Возможно, вам нужно использовать только оператор 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 будет только "да". Я знаю, что этот счетчик бесполезен, но иногда есть функции, которые вам понадобятся для запуска, не имеет значения, если это true или false, и просто присвоить значение одного из них в переменную.