IIf ()와 If의 성능 차이


답변:


140

VB는 If질문이 언급 하는 다음 진술을 가지고 있다고 생각합니다.

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

첫 번째는 기본적으로 C #의 삼항 조건 연산자이고 두 번째는 병합 연산자입니다 (이 result아닌 Nothing경우 반환,이 경우 return "Alternative"). If따라서 교체 IIf되었으며 후자는 더 이상 사용되지 않습니다.

C #에서와 마찬가지로 VB의 조건부 If연산자가 단락되므로 이제 IIf함수를 사용하여 불가능한 다음을 안전하게 작성할 수 있습니다 .

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

2
성능 질문에 대답하지 않았고 .NET의 부작용에 대해서도 언급하지 않았습니다 IIf.
jor

2
@jor 내 대답의 마지막 단락은 부작용에 관한 것입니다. 옵션 중 하나가 사용되지 않는 경우 성능은 실제로 관련이 없습니다. 그만한 가치는 네이티브 연산자 IfIIf함수 보다 훨씬 효율적 입니다.
Konrad Rudolph

2
@mmcrae 정확하고 의도적으로 : 내가 말했듯이 IIf는 쓸모 없기 때문에 논의 할 의미가 거의 없습니다. 즉, 마지막 단락에서 관련 차이점에 대해 설명합니다. 그게 당신이 알아야 할 전부입니다.
Konrad Rudolph

2
좋은 표준을 지원하고 초보자가 나쁜 관행을 받아들이지 않도록 해주셔서 감사합니다.하지만 누군가가 그 차이를 더 잘 이해하도록 만드는 완벽하게 합법적 인 문제를 가지고있을 수 있습니다. 그것을 사용하는 다른 도구 등. That's all you need to know, really지식 공유에 전념하는 웹 사이트에 도움이되는 태도처럼 들리지 않습니다.)
Don Cheadle

1
@mmcrae 오, 나는 무시하려고 한 것이 아니라 IIf의 내부가 지루할 정도로 사소하다는 것을 의미했습니다. 그것은 단순히 내 대답의 마지막 코드가 실행되지 않을 것이라는 것을 의미하는 전통적인 If 문을 포함합니다.
Konrad Rudolph

65

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!

13

또한 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


이것이 이전 IIF를 교체하는 경우 IIF에 문제가 있었지만 많은 코드 줄을 추가하면 절약 한 이유입니다.
NiL 2014

7

형식 추론 메커니즘을 올바르게 사용하려면 IIf 대신 If를 사용하는 것이 좋습니다 (옵션 Infer On).

이 예에서 키워드는 If를 사용할 때 문자열로 인식됩니다.

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

그렇지 않으면 Object로 인식됩니다.

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

6

이 사람 에 따르면 IIf는 If / Then보다 최대 6 배까지 걸릴 수 있습니다. YMMV.


1
내 임시 계산 (10000000주기)에서 IIf가 약 12 ​​배 더 느리다고 평가했습니다!
Phantômaxx

6

또한이 경우 성능보다 가독성이 더 선호 될 것입니다. IIF가 더 효율적이더라도 대상 청중이 쉽게 읽을 수는 없습니다 (Visual Basic에서 작업하는 경우 다른 프로그래머가 코드를 쉽게 읽을 수 있기를 원한다고 가정합니다. 이는 VB의 가장 큰 장점입니다 ... 제 의견으로는 IIF와 같은 개념으로 손실됩니다.)

또한 "IIF는 함수입니다. IF는 언어 구문의 일부입니다." ... 이는 실제로 If가 더 빠르다는 것을 의미합니다. 해당 기능에서 찾은 로직을 수행하기 위해 메모리의 다른 공간으로 이동하지 않고 작은 opcode 세트로 이동합니다. 아마도 진부한 차이이지만 주목할 가치가 있습니다.


6

If와 IIf의 주요 차이점은 다음과 같습니다.

  • If (test [boolean], statement1, statement2)는 테스트 값에 따라 satement1 또는 statement2가 실행됨을 의미합니다 (하나의 문만 실행 됨).

  • Dim obj = IIF (test [boolean], statement1, statement2)는 두 명령문이 모두 실행되지만 테스트 값에 따라 둘 중 하나가 (obj)에 값을 반환 함을 의미합니다.

따라서 문 중 하나가 예외를 throw하면 어쨌든 (IIf)에서 throw되지만 (If)에서는 조건이 해당 값을 반환하는 경우에만 예외를 throw합니다.


5

... 6 배까지 걸리는 이유에 대해서는 위키를 인용하십시오.

IIf는 라이브러리 함수이기 때문에 항상 함수 호출의 오버 헤드가 필요하지만 조건부 연산자는 인라인 코드를 생성 할 가능성이 더 높습니다.

기본적으로 IIf는 C ++ / C #의 삼항 연산자와 동일하므로 원하는 경우 멋진 한 줄의 if / else 형식 문을 제공합니다. 원하는 경우 평가하는 기능을 제공 할 수도 있습니다.


1

그 기능은 다릅니다! 아마도 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가 참인지 거짓인지는 중요하지 않으며 그중 하나의 값을 변수에 할당하면됩니다.


둘 다 실행해야하는 경우 둘 다 명시 적으로 호출 한 다음 표준 If를 수행해야합니다. IIf()이런 식으로 사용 하면 코드를 읽는 사람들이 혼란 스러울 것입니다.
Spivonious

나는 그것을 알고 있지만 질문은 그 둘의 차이에 관한 것입니다.
titol

나는 논평이 비판으로 다가오는 것을 의미하지 않았다. 이런 식으로 사용하는 것은 좋은 습관이 아니라는 점을 지적했습니다.
Spivonious
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.