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



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

596   9  

9 ответов:

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

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

первый-это в основном тернарный условный оператор C#, а второй-его оператор объединения (return result если это Nothing в случае возврата "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(против.71).аспн

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

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

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

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

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

по данным этот парень, IIf может занять до 6x так долго, как если бы / тогда. МММ.

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

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

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

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

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

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

...Что касается того, почему это может занять столько времени, сколько 6x, quoth The 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, и просто присвоить значение одного из них в переменную.

Comments

    Ничего не найдено.