IT

IIf ()와 If의 성능 차이

lottoking 2020. 8. 21. 08:02
반응형

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경우 반환,이 경우 반환 "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


형식 추론을 사용하는 것이 좋습니다 (옵션 Infer On).

이 예에서 키워드는 사용할 때 사용할 수 있습니다.

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

개체로 인식됩니다.

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

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


또한이 경우 성능보다 가독성이 더 선호 될 것입니다. (Visual Basic에서 쉽게 읽을 수있는 다른 프로그래머가 코드를 쉽게 읽을 수 있습니다. 이는 VB의 가장 큰 장점입니다 ... 제 의견으로는 IIF와 같은 개념으로 축소됩니다.)

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


If와 IIf의 주요 차이점은 다음과 가변합니다.

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

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

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


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

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

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


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

참고 URL : https://stackoverflow.com/questions/28377/performance-difference-between-iif-and-if

반응형