IIf() 和 If 之间的性能差异
-
09-06-2019 - |
题
在 Visual Basic 中,使用 IIf
函数而不是 If
陈述?
解决方案
VB有以下内容 If
问题所指的陈述,我认为:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
第一个基本上是 C# 的三元条件运算符,第二个是它的合并运算符(返回 result
除非是 Nothing
, ,在这种情况下返回 "Alternative"
). If
从而取代了 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
更好地使用 If 而不是 IIf 来正确使用类型推断机制(Option Infer On)
在此示例中,当我使用 If 时,Keywords 被识别为字符串:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
否则,它被识别为一个 Object :
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
根据 这家伙, IIf 的时间最多是 If/Then 的 6 倍。YMMV。
最重要的是,在这种情况下,可读性可能比性能更受青睐。即使 IIF 更高效,对于目标受众来说它的可读性也较差(我假设如果您使用 Visual Basic 工作,您希望其他程序员能够轻松阅读您的代码,这是 VB 的最大好处......在我看来,像 IIF 这样的概念就丢失了这一点)。
还, “IIF 是一个函数,而 IF 是语言语法的一部分”...这对我来说确实意味着如果会更快......if 没有别的原因,If 语句可以直接归结为一小组操作码,而不必转到内存中的另一个空间来执行所述函数中的逻辑。也许这是一个陈词滥调的差异,但值得注意。
我认为 If 和 IIf 之间的主要区别是:
如果(test [boolean],statement1,statement2)意味着根据测试值SATEMENT1或STACTER2将执行(只有一个语句将执行)
dim obj = iif(test [boolean],statement1,statement2)意味着两个语句将执行,但根据测试值,其中一个将返回一个值,将一个值返回(obj)。
因此,如果其中一个语句将抛出异常,它无论如何都会在 (IIf) 中抛出异常,但在 (If) 中,它会抛出异常,以防条件返回其值。
...至于为什么它需要长达 6 倍的时间,引用 wiki:
由于IIF是库函数,因此它将始终需要函数调用的开销,而条件运营商更有可能生成内联代码。
本质上,IIf 相当于 C++/C# 中的三元运算符,因此如果您愿意,它可以为您提供一些不错的 1 行 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 将仅为“YES”。我知道这个计数器的东西是没用的,但有时有些函数你需要同时运行,无论 IF 是 true 还是 false,只需将其中一个函数的值分配给你的变量即可。