[vb.net] IIf ()와 If의 성능 차이

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경우 반환,이 경우 return "Alternative"). If따라서 교체 IIf되었으며 후자는 더 이상 사용되지 않습니다.

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

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


답변

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!


답변

또한 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 대신 If를 사용하는 것이 좋습니다 (옵션 Infer On).

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

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가 더 빠르다는 것을 의미합니다. 해당 기능에서 찾은 로직을 수행하기 위해 메모리의 다른 공간으로 이동하지 않고 작은 opcode 세트로 이동합니다. 아마도 진부한 차이이지만 주목할 가치가 있습니다.


답변

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

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

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

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