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 내 대답의 마지막 단락은 부작용에 관한 것입니다. 옵션 중 하나가 사용되지 않는 경우 성능은 실제로 관련이 없습니다. 그만한 가치는 네이티브 연산자 If가 IIf함수 보다 훨씬 효율적 입니다.
— 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.