提问人:Bryan Roth 提问时间:8/26/2008 最后编辑:Emil LaineBryan Roth 更新时间:4/20/2017 访问量:65801
IIf() 和 If 之间的性能差异
Performance difference between IIf() and If
答:
根据这个人的说法,IIf 最多可以花费 If/Then 的 6 倍。YMMV。
评论
...至于为什么它可能需要长达 6 倍的时间,引用 wiki:
因为 IIf 是一个库函数,所以它 将始终需要 函数调用,而条件 运营商将更有可能产生 内联代码。
本质上,IIf 相当于 C++/C# 中的三元运算符,所以如果你愿意,它会给你一些不错的 1 行 if/else 类型语句。如果需要,您还可以给它一个函数来评估。
最重要的是,在这种情况下,可读性可能比性能更受欢迎。即使 IIF 效率更高,它对目标受众来说也不太易读(我假设如果你在 Visual Basic 中工作,你希望其他程序员能够轻松阅读你的代码,这是 VB 最大的好处......在我看来,像 IIF 这样的概念已经丢失了)。
此外,“IIF 是一个函数,而 IF 是语言语法的一部分”......这对我来说意味着,确实,如果会更快......如果仅此而已,If 语句可以直接归结为一小组操作码,而不必转到内存中的另一个空间来执行所述函数中的逻辑。也许这是一个陈词滥调的差异,但值得注意的是。
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
评论
VB有以下陈述,我认为这个问题指的是:If
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
第一个基本上是 C# 的三元条件运算符,第二个是它的合并运算符(return 除非是 ,在这种情况下 return )。 因此被取代,后者已经过时。result
Nothing
"Alternative"
If
IIf
与 C# 一样,VB 的条件运算符会短路,因此您现在可以安全地编写以下内容,而使用该函数无法做到这一点:If
IIf
Dim len = If(text Is Nothing, 0, text.Length)
评论
IIf
If
IIf
That's all you need to know, really
最好使用 If 而不是 IIf 来正确使用类型推理机制(Option Infer On)
在此示例中,当我使用 If 时,关键字被识别为字符串:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
否则,它被识别为对象:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
我认为 If 和 IIf 之间的主要区别在于:
If(测试 [布尔], 语句 1, 语句 2) 这意味着根据测试值,将执行 satement1 或 statement2 (只需执行一个语句)
Dim obj = IIF(测试 [布尔值] , 语句 1, 语句 2) 这意味着这两个语句都将执行,但根据测试值,其中一个语句将返回一个值给 (obj)。
因此,如果其中一个语句抛出异常,它无论如何都会将其抛入 (IIf),但在 (If) 中,它会抛出它,以防万一条件返回其值。
这些功能是不同的!也许你只需要使用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 是真还是假,只需将其中一个函数的值分配给你的变量。
评论
IIf()
评论