2014-12-19 8 views
2

두 개의 문자열을 비교 한 코드 샘플에는 성능 최적화가 있습니까?성능 - str_01 == str_02 vs (객체) str_01 == (객체) str_02

첫째 :

public static bool Compare_01() 
{ 
    string str_01 = "a"; 
    string str_02 = "a"; 

    if (str_01 == str_02) 
     return true; 
    else 
     return false; 
} 

2 :

public static bool Compare_02() 
{ 
    string str_01 = "a"; 
    string str_02 = "a"; 

    if ((object)str_01 == (object)str_02) 
     return true; 
    else 
     return false; 
} 

는 둘 다 true을 반환합니다.

그들의 위원장 코드에서 다른 하나있다 :

1 :

IL_0001: ldstr  "a" 
IL_0006: stloc.0  // str_01 
IL_0007: ldstr  "a" 
IL_000C: stloc.1  // str_02 
IL_000D: ldloc.0  // str_01 
IL_000E: ldloc.1  // str_02 
IL_000F: call  System.String.op_Equality 

2 :

IL_0001: ldstr  "a" 
IL_0006: stloc.0  // str_01 
IL_0007: ldstr  "a" 
IL_000C: stloc.1  // str_02 
IL_000D: ldloc.0  // str_01 
IL_000E: ldloc.1  // str_02 
IL_000F: ceq   

내가 System.String이 뭔가를 발견

public static bool Equals(String a, String b) { 
    // Here 
    if ((Object)a==(Object)b) { 
     return true; 
    } 
    // **** 

    if ((Object)a==null || (Object)b==null) { 
     return false; 
    } 

    if (a.Length != b.Length) 
     return false; 

    return EqualsHelper(a, b); 
} 

답변

7

버전 "2"는 다른 무언가를 : 그것은 참조 평등 (당신이 편집에 추가 된 IL의 ceq에서 볼 수)에 대한 비교합니다. 이것은 이 문자열 internation으로 인해 기본 테스트에서 자주 작동하지만 신뢰할 수 없습니다. 우연히 만 작동합니다.

return str_01 == str02; 

이 "평등이 두 문자열을 비교"표현의 관용적 방법이며, 그것은 string.Equals(string a, string b)어쨌든에 전화로 인라인됩니다

은 기본적으로 그냥 사용합니다.

+0

그럼 왜 둘 다'true'를 반환합니까? 그들의 참조는 달라야한다. –

+1

@ Mohamadshiralizadeh 나는 이미 말했다 : "string interning". 코드에 내장 된 (그리고'ldstr'를 통해로드 된) 모든 상수 문자열은 자동적으로 인턴됩니다. 다음은 반대 사례입니다. http://pastie.org/9789644. 여러분의 예제에서 IL은'ldstr'을 사용한다는 것에주의하십시오. –

+0

오른쪽. 내가 참조.. –

3

Compare_01()Compare_02()은 동일한 것을하는 이 아니라입니다. 첫 번째는 나중에 참조를 비교하는 동안 문자열 값을 비교합니다. JIT와 Runtime이 문자열 a을 생성하고 두 변수에 동일한 주소를 할당하면 둘 다 true를 반환합니다.

각 문자열 리터럴이 반드시 새로운 문자열 인스턴스를 생성하지는 않습니다. 문자열 같음 연산자 (7.9.7 절)에 따라 에 해당하는 두 개 이상의 문자열 리터럴이 동일한 어셈블리 인 에 있으면이 문자열 리터럴은 동일한 문자열 인스턴스를 참조합니다. 단순히 값을 비교하려면 bool (true 또는 false)는 식의 결과를 반환하지 왜 예를 들어, 출력은 MSDN

class Test 
{ static void Main() { 
     object a = "hello"; 
     object b = "hello"; 
     System.Console.WriteLine(a == b);  
    } 
} 

에 의해 생산.

public static bool CompareStr(String str1 , String str2) 
{ 
     return str1 == str2; 
} 
+0

.netFrameWork에서 Microsoft에서 사용하는 코드의 성능 최적화에 대해 알고 싶습니다. 나는 그 코드를 안다. –

+0

둘 다'true'를 반환합니다. –

+0

@Mohamadshiralizadeh 만약 당신이'Compare_02'를 뜻한다면 : 그것은 신뢰할 수없는 이유로 true를 반환합니다; 'Compare_01'이 true를 반환하고'Compare_02'가 거짓을 반환하는 예제를 제공 할 수 있습니다. http://pastie.org/9789644 –

4

참조를 비교하는 것이 더 빠르지 만 동일한 인스턴스가 아니더라도 문자열은 동일한 값을 가질 수 있습니다.비교가 다른 일을하기 때문에 문자열 비교를위한 최적화로 참조 비교를 사용할 수 없습니다. 동일한 값을 갖지만 동일한 인스턴스 아닌 두 문자열을 비교하면

에는 그 차이를 볼 수

string str_01 = "ab"; 
string str_02 = String.Concat("a", "b"); 

Console.WriteLine(str_01 == str_02); 
Console.WriteLine((object)str_01 == (object)str_02); 

출력 :

True 
False 

String.Equals 방법은 기준 비교를 사용 실제로 동일한 인스턴스 인 두 개의 문자열을 비교할 때 대소 문자를 잡으려고합니다. 문자열이 별도의 인스턴스 인 경우 문자열의 값을 비교합니다.