2014-09-11 6 views
0

У меня есть строка, которую я должен редактировать довольно много. Длина не определена. Replace(string, string) будет наиболее удобным для этого способом.String vs. StringBuilder при редактировании длинной строки?

Что лучше string.Replace("", "") или StringBuilder.Replace("", "")?

public static string FormatMyString(string input) 
{ 
    // ... 
} 

(.. Примеры кода просты и глупы они просто служат цели, чтобы показать вам, что я делаю, я всегда получаю вопросы: «Что вы пытаетесь сделать?»)

+3

Кто знает, что лучше?Вам нужно определить свои критерии для «лучшего», а затем вам нужно проверить ** свой код с вашими данными **. Только тогда вы узнаете. – Enigmativity

+0

Отъезд: http://stackoverflow.com/questions/6524528/string-replace-vs-stringbuilder-replace – Robban

+0

Для редактирования огромной строки: http://en.wikipedia.org/wiki/Rope_(data_structure). Возможно, вы сможете найти достаточную реализацию. –

ответ

2

Что лучше string.Replace("", "") или StringBuilder.Replace("", "")?

Ни то, ни другое. Они оба ничего не делают. В более общем случае:

  • если вы делаете одну замену, внутренний-вызов String.Replace должна быть тонкой
  • если вы делаете много замен, считаютStringBuilder избежать промежуточного строки
+1

Но это все равно сводится к тому, чтобы сравнить тесты, чтобы узнать, что лучше. И вам нужно сравнить использование памяти, скорость выполнения, а также удобство обслуживания кода, чтобы сделать лучший выбор. – Enigmativity

0

IMHO String Builder - это путь.

У этого есть затраты на создание, но он будет предлагать намного лучшую работу в целом из-за гораздо более эффективных манипуляций с строкой и конкатенации.

Как я уже сказал, есть стоимость, поэтому вы должны учитывать, что означает «редактировать довольно много».

К сожалению, я не могу представить фактические результаты тестов прямо сейчас, но я предполагаю, что порог для использования типа String Builder должен быть очень низкими ...

Надеется, что это помогает.

+0

Не обязательно верно, что 'StringBuilder' будет работать быстрее. Я только что протестировал построение 10 000 000 строк, используя 'StringBuilder' против конкатенации строк, а' StringBuilder' был в два раза медленнее **. У вас ** есть ** для сравнения, чтобы делать подобные заявления. – Enigmativity

0

Вы просто не получаете какую-либо полезную ценность, просто «спрашивая» об этих вещах. Вам нужно ориентироваться. Возьмите этот код, например:

var sw = Stopwatch.StartNew(); 
var cc0 = GC.CollectionCount(0); 
var s = (string)null; 
for (var i = 0; i < 10000000; i++) 
{ 
    s = "a"; 
    s += "b"; 
} 
var cc1 = GC.CollectionCount(0); 
sw.Stop(); 
Console.WriteLine(
    "collections == {0}, ms == {1}, string == \"{2}\"", 
    cc1 - cc0, 
    sw.ElapsedMilliseconds, 
    s); 

Против этого кода:

var sw = Stopwatch.StartNew(); 
var cc0 = GC.CollectionCount(0); 
var sb = (StringBuilder)null; 
for (var i = 0; i < 10000000; i++) 
{ 
    sb = new StringBuilder(); 
    sb.Append("a"); 
    sb.Append("b"); 
} 
var cc1 = GC.CollectionCount(0); 
Console.WriteLine(
    "collections == {0}, ms == {1}, string == \"{2}\"", 
    cc1 - cc0, 
    sw.ElapsedMilliseconds, 
    sb.ToString()); 

два результата я получаю являются:

collections == 63, ms == 336, string == "ab" // += 
collections == 228, ms == 692, string == "ab" // StringBuilder 

StringBuilder берет в два раза длиннее и вызывает более 3,5 раза больше сборок мусора.

Это, безусловно, случай, если бы я соединил очень длинные строки, что StringBuilder будет работать лучше, но я не буду знать эту точку, если не буду ее измерять.

Вам нужно предоставить более подробную информацию о том, какой код вы используете, и что вы подразумеваете под «лучше» (быстрее, меньше памяти, легко читается код и т. Д.), Прежде чем мы сможем сказать, что лучше.

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