programing

IIf()와 If 간의 성능 차이

projobs 2023. 5. 14. 23:26
반응형

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두 첫번연항산반기다입본는자으로니 C#의조건 3연산고이자두연결자합산번는연째산환자째적반항입#▁the다▁(return연니▁its▁andales(al산자환)▁first▁thece▁operator)입니다.resultNothing 그경에는우는에그▁in를 반환합니다."Alternative").If 따서대습니다었체되라다▁thus를 대체했습니다.IIf그리고 후자는 쓸모가 없습니다.

C#은 VB입니다.Ifoperator 하게 다음을 쓸. short-link를 합니다.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)

대부분의 사람들이 처음 봤을 때 그 기능이 작동한다고 생각하는 방식이 아닌, 실제로 예외를 던질 것입니다.이것은 또한 응용프로그램에서 버그를 수정하는 것이 매우 어려운 결과를 초래할 수 있습니다.

IIf 함수 - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx

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

IIF 대신 If를 사용하여 유형 추론 메커니즘을 올바르게 사용하는 것이 좋습니다(옵션 추론).

이 예에서 키워드는 다음과 같은 경우를 사용할 때 문자열로 인식됩니다.

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

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

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

무엇보다도, 이 경우에는 성능보다 가독성이 더 선호되어야 할 것입니다.IIF가 더 효율적이었다고 해도 대상 사용자가 쉽게 읽을 수 있는 수준은 아닙니다(Visual Basic에서 작업하는 경우 다른 프로그래머가 사용자의 코드를 쉽게 읽을 수 있기를 바라는 것이 VB의 가장 큰 이점입니다).제 생각에는 IIF와 같은 개념으로 손실됩니다.)

또한, "IIF는 함수이며, IF는 언어 구문의 일부입니다"...그 말은 제게, 사실, 더 빨리...If 문이 해당 함수에서 발견된 논리를 수행하기 위해 메모리의 다른 공간으로 이동하지 않고 작은 opcode 집합으로 직접 졸일 수 있다면 그에 다름 아닙니다.그것은 아마도 사소한 차이일 것이지만, 주목할 가치가 있습니다.

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

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

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

따라서 문 중 하나가 예외를 던지면 (IIF)에 던지지만 (If)에는 조건이 값을 반환할 경우에 대비하여 던집니다.

...6배나 오래 걸리는 이유에 대해 Wiki를 인용합니다.

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

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

그 기능들은 다릅니다!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가 참인지 거짓인지는 중요하지 않습니다. 그리고 변수에 값을 할당하기만 하면 됩니다.

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

반응형