IIf() 和 If 之间的性能差异

Performance difference between IIf() and If

提问人:Bryan Roth 提问时间:8/26/2008 最后编辑:Emil LaineBryan Roth 更新时间:4/20/2017 访问量:65801

问:

在 Visual Basic 中,使用函数而不是语句时是否存在性能差异?IIfIf

vb.net if 语句 iif 函数

评论


答:

7赞 Greg Hurlman 8/26/2008 #1

根据这个人的说法,IIf 最多可以花费 If/Then 的 6 倍。YMMV。

评论

1赞 Phantômaxx 12/1/2014
在我的模拟计算(10000000 次循环)中,我评估了 IIf 的速度慢了大约 12 倍!
5赞 Dillie-O 8/26/2008 #2

...至于为什么它可能需要长达 6 倍的时间,引用 wiki:

因为 IIf 是一个库函数,所以它 将始终需要 函数调用,而条件 运营商将更有可能产生 内联代码。

本质上,IIf 相当于 C++/C# 中的三元运算符,所以如果你愿意,它会给你一些不错的 1 行 if/else 类型语句。如果需要,您还可以给它一个函数来评估。

6赞 EdgarVerona 8/26/2008 #3

最重要的是,在这种情况下,可读性可能比性能更受欢迎。即使 IIF 效率更高,它对目标受众来说也不太易读(我假设如果你在 Visual Basic 中工作,你希望其他程序员能够轻松阅读你的代码,这是 VB 最大的好处......在我看来,像 IIF 这样的概念已经丢失了)。

此外,“IIF 是一个函数,而 IF 是语言语法的一部分”......这对我来说意味着,确实,如果会更快......如果仅此而已,If 语句可以直接归结为一小组操作码,而不必转到内存中的另一个空间来执行所述函数中的逻辑。也许这是一个陈词滥调的差异,但值得注意的是。

70赞 5 revs, 3 users 38%Thomas G. Mayfield #4

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!
13赞 rjzii 8/26/2008 #5

此外,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

评论

0赞 NiL 4/24/2014
这就是为什么如果来替换旧的 IIF,我曾经遇到过 IIF 问题,但 IF 节省了添加许多代码行。
144赞 Konrad Rudolph 8/26/2008 #6

VB有以下陈述,我认为这个问题指的是:If

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

第一个基本上是 C# 的三元条件运算符,第二个是它的合并运算符(return 除非是 ,在这种情况下 return )。 因此被取代,后者已经过时。resultNothing"Alternative"IfIIf

与 C# 一样,VB 的条件运算符会短路,因此您现在可以安全地编写以下内容,而使用该函数无法做到这一点:IfIIf

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

评论

6赞 jor 5/4/2015
您没有回答性能问题,也没有提到 的副作用。IIf
2赞 Konrad Rudolph 5/4/2015
@jor 我回答的最后一段是关于副作用的。当其中一个选项过时时,性能并不真正相关。就其价值而言,到目前为止,本机运算符比函数更有效。IfIIf
2赞 Konrad Rudolph 8/8/2015
@mmcrae 这是正确的,也是故意的:正如我所说,IIf 已经过时了,所以讨论它没有什么意义。也就是说,我的最后一段确实讨论了相关的差异。这就是你需要知道的,真的。
3赞 Don Cheadle 8/8/2015
我很欣赏您希望支持良好的标准并确保新手不会养成不良做法,但有人可能有一个完全合理的问题,导致他们想要更好地了解其中的区别......例如维护遗留代码,被使用它的其他工具卡住等。对于一个致力于知识共享的网站来说,这听起来不像是一种有利的态度;)That's all you need to know, really
1赞 Konrad Rudolph 8/8/2015
@mmcrae 哦,我不是要轻蔑,我只是说 IIf 的内部结构非常无聊。它只是包含一个传统的 If 语句,这意味着我的答案中的最后一段代码不会运行。
7赞 Larry 9/22/2009 #7

最好使用 If 而不是 IIf 来正确使用类型推理机制(Option Infer On)

在此示例中,当我使用 If 时,关键字被识别为字符串:

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

否则,它被识别为对象:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
6赞 some guy 12/21/2009 #8

我认为 If 和 IIf 之间的主要区别在于:

  • If(测试 [布尔], 语句 1, 语句 2) 这意味着根据测试值,将执行 satement1 或 statement2 (只需执行一个语句)

  • Dim obj = IIF(测试 [布尔值] , 语句 1, 语句 2) 这意味着这两个语句都将执行,但根据测试值,其中一个语句将返回一个值给 (obj)。

因此,如果其中一个语句抛出异常,它无论如何都会将其抛入 (IIf),但在 (If) 中,它会抛出它,以防万一条件返回其值。

1赞 titol 3/17/2015 #9

这些功能是不同的!也许你只需要使用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 是真还是假,只需将其中一个函数的值分配给你的变量。

评论

2赞 Spivonious 5/9/2016
如果需要同时运行两者,则应显式调用它们,然后执行标准的 If。以这种方式使用只会使阅读代码的人感到困惑。IIf()
0赞 Spivonious 5/11/2016
我并不是要让评论成为批评;我只是指出,以这种方式使用它不是一个好的做法。