성능, 예기치 않은 동작 또는 가독성에 관한최고의 성능
if(string.Empty.Equals(text))
및
if(text.Equals(string.Empty))
사이에 어떤 차이가 있나요?
성능, 예기치 않은 동작 또는 가독성에 관한최고의 성능
if(string.Empty.Equals(text))
및
if(text.Equals(string.Empty))
사이에 어떤 차이가 있나요?
이들은 동일한 성능 특성을 갖습니다.
text
이 null
인 경우 두 번째 줄은 NullReferenceException
입니다.
if(text == string.Empty)
더 읽기.
그리고 거기에 내장되어 있습니다 :
if(string.IsNullOrEmpty(text))
그리고 .NET 4.0 :
if(string.IsNullOrWhitespace(text))
이 경우 성능에 차이가 없어야합니다. 그것은 "x == y"와 "y == x"를 비교하는 것과 같습니다.
내가 가장 잘 읽을 수있는 문법은 if (text == string.Empty)
이지만 그게 나야.
물론 if (string.IsNullOrEmpty(text)) { }
또는 string.IsNullOrWhiteSpace(text)
을 사용할 수도 있습니다.
예기치 않은 동작에 대해서는 매우 간단한 문자열 비교입니다. 예기치 않은 행동을 어떻게 피할 수 있을지 상상할 수 없습니다.
내가 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, 가장 빠른 것 같습니다, 그래서 선택하십시오;)
그들은 동일한 행동을합니다.예기치 않은 동작에 대해서는 text = null 인 경우 두 번째 문자가 NullReferenceException
이 될 수 있습니다. if (!string.IsNullOrEmpty(text))
은 예기치 않은 예기치 않은 동작과 NRE의 가능성없이 동일한 결과 (동일한 성능, 동일한 결과)를 달성하기 위해 더 자연스러워 보입니다.
등가입니다.
첫 번째 경우 :
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>
? 정말로 중요합니까? (당신이 정렬/검색 중이거나 비슷한 경우가 아니라면 먼저 프로필을 작성해야하고 대답이 있어야합니다.) –
'String.IsNullOrEmpty (text)'는 어떻습니까? – alex
'text.Length == 0' – ordag