Разница в производительности между IIf() и If
-
09-06-2019 - |
Вопрос
Есть ли разница в производительности в Visual Basic при использовании IIf
функция вместо If
заявление?
Решение
В ВБ есть следующее If
утверждение, к которому относится вопрос, я думаю:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Первый — это, по сути, тернарный условный оператор C#, а второй — оператор объединения (return result
если это не Nothing
, в этом случае возврат "Alternative"
). If
таким образом заменил IIf
и последний устарел.
Как и в C#, условное выражение VB If
оператор закорачивает, поэтому теперь вы можете безопасно написать следующее, что невозможно с помощью IIf
функция:
Dim len = If(text Is Nothing, 0, text.Length)
Другие советы
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!
Кроме того, еще одна большая проблема с 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
Лучше использовать If вместо IIf, чтобы правильно использовать механизм вывода типа (Option Infer On)
В этом примере ключевые слова распознаются как строка, когда я использую If:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
В противном случае он распознается как Object:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
В соответствии с этот парень, IIf может занять в 6 раз больше времени, чем If/Then.ЮММВ.
Кроме того, в этом случае читаемость, вероятно, должна быть более предпочтительной, чем производительность.Даже если бы IIF был более эффективным, он просто менее читабелен для целевой аудитории (я предполагаю, что если вы работаете в Visual Basic, вы хотите, чтобы другие программисты могли легко читать ваш код, что является самым большим благом VB...и что, на мой взгляд, теряется в таких понятиях, как IIF).
Также, «IIF — это функция, а IF — часть синтаксиса языков»...это подразумевает для меня, что действительно, если бы было быстрее...if только для того, чтобы оператор If мог быть сведен непосредственно к небольшому набору кодов операций, вместо того, чтобы обращаться к другому пространству в памяти для выполнения логики, найденной в указанной функции.Возможно, это банальная разница, но ее стоит отметить.
Я считаю, что основная разница между If и IIf заключается в следующем:
Если (test [boolean], aturncy1, atervation2) это означает, что в соответствии с тестовым значением Sapement1 или оператором 2 будет выполнено (только один оператор будет выполнен)
Dim obj = iif (test [boolean], aturning1, atervice2) это означает, что оба утверждения будут выполняться, но в соответствии с тестовым значением один из них вернет значение (OBJ).
поэтому, если один из операторов выдаст исключение, он все равно выдаст его в (IIf), но в (If) он выдаст его на тот случай, если условие вернет свое значение.
...что касается того, почему это может занять до 6 раз, цитирует вики:
Поскольку IIF является библиотечной функцией, она всегда потребует накладных расходов функционального вызова, тогда как условный оператор, скорее всего, будет производить встроенный код.
По сути, IIf является эквивалентом тернарного оператора в C++/C#, поэтому он дает вам несколько хороших однострочных операторов типа 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 будет только «ДА».Я знаю, что эти счетчики бесполезны, но иногда есть функции, которые вам нужно будет запускать одновременно, независимо от того, является ли IF истинным или ложным, и просто присвоить значение одной из них вашей переменной.