Сведения о вопросе

nikolya

03:48, 10th August, 2020

Теги

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

Просмотров: 553   Ответов: 9

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



  Сведения об ответе

прога

10:52, 21st August, 2020

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

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

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

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

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


  Сведения об ответе

#hash

22:30, 21st August, 2020

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!


  Сведения об ответе

repe

01:40, 18th August, 2020

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


  Сведения об ответе

9090

21:44, 12th August, 2020

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

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

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

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

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


  Сведения об ответе

SEEYOU

07:39, 8th August, 2020

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

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

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

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


  Сведения об ответе

qwerty101

07:39, 4th August, 2020

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


  Сведения об ответе

VERSUION

19:05, 19th August, 2020

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

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


  Сведения об ответе

piter

16:26, 6th August, 2020

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

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

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


  Сведения об ответе

DO__IT

06:26, 18th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться