2016-11-05 3 views
1

이 같은 string.Format를 사용 하는가 :많은 args : string 또는 StringBuilder가있는 string.Format을 사용할 때 더 뛰어난 성능을 제공합니까?

string.Format(txt, arg0, arg1, arg2, arg3, arg4,...) 

따라서 그것은이 인수 목록에서 새로운 문자열을 추가 할 때마다 새로운 객체를 생성 txt+=args; 말과 동일하다? StringBuilder.Format을 사용하면 더 효율적입니까?

+2

[당신의 말을 경구하려고하지 마십시오] (https://ericlippert.com/2012/12/17/performance-rant/)? – Steve

+0

당신은 다음과 같은 것을 시도 할 것입니다 :'string st = ""; for (int i = 0; i <9000; i ++) { st + = "dop"; }'빨리 망할! 비극적 인 루프이지만, 왜? 그것은 9000 개의 객체를 생성했기 때문입니다. 'StringBuilder.Format'이 테스트를 통해 객체를 전파 하는지를 아는 방법? –

+2

이와 같은 질문이있을 때 먼저 [참조 소스] (https://referencesource.microsoft.com/#mscorlib/system/string.cs,691a34e179b91fdb)를보십시오. StringBuilderCache는 프레임 워크 코드가 빠르지 않고 도움이 필요 없다고 확신시켜야합니다. –

답변

1

내 의견은 위의 당신이 당신의 환경에서 성능을 테스트해야합니다 것을 의미한다. Stopwatch 인스턴스를 사용하여 적어도 10000 번 이상 string.Format 및 StringBuilder.AppendFormat을 실행하는 루프를 만든 다음 Stopwatch.ElapsedMilliseconds의 값을 측정합니다. 이것은 대략 당신에게 차이에 대한 아이디어를 줄 것입니다.

광산 환경에서 두 가지 접근법은 매우 동일합니다. 100000 루프의 차이는 StringBuilder에 대한 2/3 밀리 초 장점이지만 사기는 다음과 같습니다 (당신이 절대적으로 명확하지 않는 한 노력 결과의 가치가)

는 MICROOPTIMIZATIONS

하지 않습니다.

샘플 :

string s1 = "Argument 1"; 
string s2 = "Argument 2"; 
string s3 = "Argument 3"; 
string s4 = "Argument 4"; 
string s5 = "Argument 5"; 
string s6 = "Argument 6"; 
string s7 = "Argument 7"; 
string s8 = "Argument 8"; 
string s9 = "Argument 9"; 

string result = string.Empty; 
object[] data = new object[] { s1, s2, s3, s4, s5, s6, s7, s8, s9 }; 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
for(int x = 0; x < 100000; x++) 
    result = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8}", data); 
sw.Stop(); 
Console.WriteLine(sw.ElapsedMilliseconds); 

StringBuilder sb = new StringBuilder(); 
sw = new Stopwatch(); 
sw.Start(); 
for (int x = 0; x < 100000; x++) 
{ 
    sb.Length = 0; 
    sb.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8}", data); 
    result = sb.ToString(); 
} 
sw.Stop(); 
Console.WriteLine(sw.ElapsedMilliseconds); 
+0

런타임에'string + ='에 의해 생성 된 객체를 볼 수있는 방법이 있습니까? –

+1

확실하지 않습니다. 어떤 물건에 대해 이야기하고 있습니까? 문자열이 변경되지 않으므로 + = 연산자를 호출 할 때마다 변수의 이전 값과 추가 된 문자열을 사용하여 새 문자열이 만들어집니다. 그런 다음 새 문자열이 변수에 할당됩니다. – Steve

0

문자열 형식을 사용하는 경우 string.Format을 사용하십시오. 문자열 및/또는 문자열 형식의 연결을 많이 사용하는 경우 StringBuilder를 사용하십시오.

에 체크를 아웃 : https://support.microsoft.com/en-us/kb/306822

0

및 String.format이 구현에서의 StringBuilder를 사용하는, 그래서 당신은 더 나은 어느 말할 수 없습니다.