2012-06-21 3 views
2

광범위 한 StringBuilder.Append() 작업은 포인터를 사용하여 문자별로 문자열을 작성하기 위해 스레드의 스택에 할당 된 char[]을 사용하여 최적화 할 수 있습니까?문자열 작성기의 성능 향상

 unsafe 
     { 
      const Int32 width = 1024; 

      Char* msg = stackalloc Char[width]; 

      Int32 index = 0; 

      property = Environment.MachineName; 

      for (Int32 i = 0; i < property.Length; i++) 
        msg[index++] = property[i];    

      return new String(msg, 0, width); 
     } 

이는 결과적으로 매우 만족하지 StringBuilder을 사용하는 것에 비해 약 25 % 개선을 제공한다.

+4

무엇이 문제입니까? – Nuffin

+2

@ Nuffin 음, 아마도 맨 처음 줄? 그냥 물음표가 필요합니다. 그러나이 질문은 두 번째 라인과 맞지 않는 것으로 보입니다. 아마도 OP는 [코드 검토] (http://codereview.stackexchange.com/)를 원할 것입니다. –

+6

실험적으로 StringBuilder.Append를 사용하면 응용 프로그램의 병목 현상이 발생했으며 실제로 포인터와 안전하지 않은 코드 수준으로 내려와야한다고 측정 했습니까? 아니면 단호한 이유없이 CPU주기를 몇 번 절약하기 위해 조기에 시도하고 있습니까? –

답변

7

최종 문자열이 얼마나 커지는 지에 대한 아이디어가 있다면 (해당하는 것처럼) StringBuilder을 그 용량으로 구성하여 공간 재 할당에 소요되는 시간을 줄일 수 있습니다 :

var sb = new StringBuilder(); 
// capacity 16, will expand as needed 

var sb30000 = new StringBuilder(30000); 
// capacity 30000, will not need to expand until that length is passed 

약간 도움이 될 수 있습니다.

+1

그게 꽤 있습니다 - 재 할당은 시간을 소비합니다. 그 후에 나는 차이를 만들기 위해 아주 특별한 코드를 가지고 있어야한다고 말하고 싶습니다. – TomTom