2012-06-21 9 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); 
     } 

Это дает улучшение около 25% по сравнению с использованием StringBuilder и не вполне удовлетворительным в результате.

+4

В чем вопрос? – Nuffin

+2

@ Нуффин Умм, возможно, самая первая строка? Просто нужен вопросительный знак. Тем не менее, вопрос, похоже, противоречит второй строке, возможно, OP хочет [обзор кода] (http://codereview.stackexchange.com/). –

+6

Вы экспериментально измерили, что использование StringBuilder.Append является узким местом для вашего приложения, и вам действительно нужно спуститься к указателю и небезопасному уровню кода? Или вы только преждевременно пытаетесь сэкономить пару циклов процессора без веских оснований? –

ответ

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

Смежные вопросы