2016-11-05 1 views
1

ли с помощью string.Format так:Что более важно при использовании string.Format со многими args: string или StringBuilder?

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 =" "; для (int i = 0; i <9000; i ++) { st + = "dop"; } 'Это чертовски быстро! хотя это катастрофический цикл, почему? потому что он создал 9000 объектов. как узнать, распространяется ли 'StringBuilder.Format' объекты путем тестирования ?! –

+2

Просто взгляните на [источник ссылки] (https://referencesource.microsoft.com/#mscorlib/system/string.cs,691a34e179b91fdb), когда у вас есть такой вопрос. StringBuilderCache должен убедить вас, что код рамки не сосать и не нуждается в вашей помощи. –

ответ

1

Мой комментарий выше означает, что вы должны проверить свои выступления в вашей среде. Используйте экземпляр секундомера, создайте цикл, который выполняется над строкой .Format и StringBuilder.AppendFormat, по крайней мере, в сто тысяч раз, а затем измерьте значение в секундомере.ElapsedMilliseconds. Это примерно даст вам представление о различиях.

В моей среде два подхода довольно идентичны. Разница на 100000 петле 2/3 миллисекунды преимущество для StringBuilder, но боевой дух:

НЕ ДЕЛАТЬ 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 в его реализации, поэтому вы не можете сказать, какая из них лучше.

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