2012-01-26 2 views
2

성능, 예기치 않은 동작 또는 가독성에 관한최고의 성능

if(string.Empty.Equals(text)) 

if(text.Equals(string.Empty)) 

사이에 어떤 차이가 있나요?

+1

? 정말로 중요합니까? (당신이 정렬/검색 중이거나 비슷한 경우가 아니라면 먼저 프로필을 작성해야하고 대답이 있어야합니다.) –

+7

'String.IsNullOrEmpty (text)'는 어떻습니까? – alex

+0

'text.Length == 0' – ordag

답변

5

이들은 동일한 성능 특성을 갖습니다.

textnull 인 경우 두 번째 줄은 NullReferenceException입니다.

는 개인적으로 내가 찾을 : 옵션 중 하나 이상

if(text == string.Empty) 

더 읽기.

그리고 거기에 내장되어 있습니다 :

if(string.IsNullOrEmpty(text)) 

그리고 .NET 4.0 :

if(string.IsNullOrWhitespace(text)) 
0

이 경우 성능에 차이가 없어야합니다. 그것은 "x == y"와 "y == x"를 비교하는 것과 같습니다.

내가 가장 잘 읽을 수있는 문법은 if (text == string.Empty)이지만 그게 나야.

물론 if (string.IsNullOrEmpty(text)) { } 또는 string.IsNullOrWhiteSpace(text)을 사용할 수도 있습니다.

예기치 않은 동작에 대해서는 매우 간단한 문자열 비교입니다. 예기치 않은 행동을 어떻게 피할 수 있을지 상상할 수 없습니다.

5

내가 IMO 여기에 가장 중요하다, 더 읽을 생각으로 내가

if (string.IsNullOrEmpty(text)) 
{ 
} 

사용하는 것이 좋습니다 것입니다 (실제로 결과는 null 값을 동일하지 않을 것이다, 그러나 두 번째 버전은 던질 것 이 특별한 테스트 케이스의 예외).

생성 된 일리노이에 차이가 있는지는 잘 모르겠지만 어떤 경우에도 그러한 미세 최적화 (있는 경우)를하면 애플리케이션을 더 빠르게 만들 수 없습니다. 내가 궁금으로

그냥 테스트 : : 편집


private static void Main(string[] args) 
{ 
    Stopwatch z1 = new Stopwatch(); 
    Stopwatch z2 = new Stopwatch(); 
    Stopwatch z3 = new Stopwatch(); 

    int count = 100000000; 

    string text = "myTest"; 

    z1.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     int tmp = 0; 
     if (string.Empty.Equals(text)) 
     { 
      tmp++; 
     } 
    } 
    z1.Stop(); 

    z2.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     int tmp = 0; 
     if (text.Equals(string.Empty)) 
     { 
      tmp++; 
     } 
    } 
    z2.Stop(); 

    z3.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     int tmp = 0; 
     if (string.IsNullOrEmpty(text)) 
     { 
      tmp++; 
     } 
    } 
    z3.Stop(); 

    Console.WriteLine(string.Format("Method 1: {0}", z1.ElapsedMilliseconds)); 
    Console.WriteLine(string.Format("Method 2: {0}", z2.ElapsedMilliseconds)); 
    Console.WriteLine(string.Format("Method 3: {0}", z3.ElapsedMilliseconds)); 

    Console.ReadKey(); 
} 

마이크로 최적화를 테스트하는 것은 항상 보는 것보다 더 복잡하기 때문에 테스트가 관련이 있는지, 그러나 여기되지 않음 결과는 다음과 같습니다.

방법 1과 2는 예상대로 동일하고 방법 3은 읽을 수있는 솔루션 IMO, 가장 빠른 것 같습니다, 그래서 선택하십시오;)

5

그들은 동일한 행동을합니다.예기치 않은 동작에 대해서는 text = null 인 경우 두 번째 문자가 NullReferenceException이 될 수 있습니다. if (!string.IsNullOrEmpty(text))은 예기치 않은 예기치 않은 동작과 NRE의 가능성없이 동일한 결과 (동일한 성능, 동일한 결과)를 달성하기 위해 더 자연스러워 보입니다.

4

등가입니다.

첫 번째 경우 :

IL_0000: nop 
IL_0001: ldsfld string [mscorlib]System.String::Empty 
IL_0006: ldarg.0 
IL_0007: callvirt instance bool [mscorlib]System.String::Equals(string) 
IL_000c: ldc.i4.0 
IL_000d: ceq 
IL_000f: stloc.0 
IL_0010: ldloc.0 
IL_0011: brtrue.s <target> 

두 번째 경우 : 테스트 쇼를 무슨 짓을했는지

IL_0000: nop 
IL_0001: ldarg.0 
IL_0002: ldsfld string [mscorlib]System.String::Empty 
IL_0007: callvirt instance bool [mscorlib]System.String::Equals(string) 
IL_000c: ldc.i4.0 
IL_000d: ceq 
IL_000f: stloc.0 
IL_0010: ldloc.0 
IL_0011: brtrue.s <target>