11 ответов:
Я тепло предлагаю вам прочитать печальная трагедия микро-оптимизации театра, Джефф Этвуд.
Это относится к простой конкатенации и StringBuilder по сравнению с другими способами.
теперь, если вы хотите увидеть некоторые цифры и графики, перейдите по ссылке;)
но если я хочу объединить 2 строки, то я предполагаю, что это лучше (быстрее) обойтись без него класс StringBuilder. Это правильно?
это действительно правильно, вы можете найти, почему именно очень хорошо объяснил :
http://www.yoda.arachsys.com/csharp/stringbuilder.html
резюмировал : если вы можете конкатинировать строки за один раз, как
var result = a + " " + b + " " + c + ..вы лучше без stringbuilder только для при копировании производится (длина результирующей строки вычисляется заранее);
для таких структур, как
var result = a; result += " "; result += b; result += " "; result += c; ..новые объекты создаются каждый раз, так что вы должны рассмотреть то StringBuilder.
В конце статьи подводятся итоги этих эмпирических правил:
Правила
Итак, когда вы должны использовать StringBuilder, и когда вы должны использовать строку операторы конкатенации?
определенно используйте StringBuilder, когда вы объединяетесь в нетривиальном петли - особенно если вы не знаете наверняка (во время компиляции) сколько итерации, которые вы сделаете через петля. Например, чтение файла характер в то время, создавая строка, как вы идете с помощью оператора += это потенциально самоубийство производительности.
определенно используйте конкатенацию оператор, когда вы можете (читабельно) укажите все, что должна стать объединены в одном заявлении. (Если вы есть множество вещей, чтобы конкатенация, подумайте о вызове Строка.Функция concat явно или Строка.Присоединяйтесь, если вам нужен разделитель.)
не бойтесь разбить литералы вверх на несколько сцепленных битов - результат будет тот же. Вы можете помочь удобочитаемость путем ломать длинный литерал в несколько строк, например, с никакого вреда для производительности.
Если вам нужно промежуточный результат конкатенации для чего-то кроме подачи следующей итерации конкатенации, StringBuilder не является Я помогу тебе. Например, если вы создаете полное имя от первого имя и фамилия, а затем добавить третья часть информации (в прозвище, может быть) до конца, вы будете только польза от использования StringBuilder если вам не нужно (имя + фамилия) строка для других целей (как это сделано в Примере, который создает человек объект.)
Если у вас есть только несколько конкатенаций делать, и вы действительно хотите их делать в отдельных заявлениях это не так действительно важно, в какую сторону вы идете. Который способ более эффективный будет зависеть от количество конкатенаций размеры из строки участвует, и какой порядок они связаны между собой. Если вы действительно поверьте, что кусок кода, чтобы быть узкое место производительности, профиль или проверьте это в обоих направлениях.
Не совсем так...вы должны использовать StringBuilder, если вы объединяете большой строки или у вас есть много конкатенаций, как в цикле.
но если я хочу объединить 2 строки, то я предполагаю, что это лучше (быстрее) сделать без StringBuilder. Это правильно?
да. Но что еще более важно, это значительно больше читабельный использовать ваниль
stringsв таких ситуациях. С другой стороны, использование его в цикле имеет смысл и также может быть читаемым, как конкатенация.Я бы опасался эмпирических правил, которые приводят конкретные числа конкатенации в качестве порога. Использование его в циклах (и только циклы), вероятно, так же полезно, легче запомнить и имеет больше смысла.
нет окончательного ответа, только эмпирические правила. Мои собственные личные правила идут примерно так:
- если конкатенация в цикле, всегда используйте
StringBuilder.- если строки большие, всегда используйте
StringBuilder.- если код конкатенации аккуратный и читаемый на экране, то это, вероятно, нормально.
Если это не так, используйтеStringBuilder.
перефразируя
тогда считай до трех, ни больше, ни меньше. Три будет число, которое ты будешь считать, и число подсчета будет три. Четыре не считай, и два не считай, если только ты не перейдешь к трем. Как только число три, будучи третьим числом, будет достигнуто, тогда лоббируй Свою Святую ручную гранату Антиохии
Я обычно использую строковый конструктор для любого блока кода, который приведет к объединение трех или более строк.
- Если вы объединяете строки в цикле, вы должны рассмотреть возможность использования StringBuilder вместо обычной строки
- в случае, если это одна конкатенация, вы можете вообще не видеть разницы во времени выполнения
вот простой тест приложение, чтобы доказать свою точку зрения:
class Program { static void Main(string[] args) { const int testLength = 30000; var StartTime = DateTime.Now; //TEST 1 - String StartTime = DateTime.Now; String tString = "test string"; for (int i = 0; i < testLength; i++) { tString += i.ToString(); } Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString()); //result: 2000 ms //TEST 2 - StringBuilder StartTime = DateTime.Now; StringBuilder tSB = new StringBuilder("test string"); for (int i = 0; i < testLength; i++) { tSB.Append(i.ToString()); } Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString()); //result: 4 ms Console.ReadLine(); } }результаты:
30'000 итераций
- строка - 2000 МС
- StringBuilder-4 ms
1000 итераций
- строка - 2 мс
- StringBuilder-1 ms
500 итераций
- строка - 0 мс
- StringBuilder-0 ms
пока вы можете физически ввести количество конкатенаций (a + b + c ...) это не должно иметь большого значения. N в квадрате (при N = 10) - это 100-кратное замедление, которое не должно быть слишком плохим.
большая проблема заключается в том, когда вы объединяете сотни строк. При N=100 вы получаете замедление в 10000X раз. Что довольно плохо.
Я не думаю, что есть тонкая грань между тем, когда использовать и когда не надо. Если, конечно, кто-то не выполнил некоторые обширные испытания, чтобы выйти с золотыми условиями.
для меня я не буду использовать StringBuilder, если просто объединю 2 огромные строки. Если есть цикл с неопределенным количеством, я, вероятно, буду, даже если цикл может быть небольшим количеством.
одна конкатенация не стоит использовать stringbuilder. Я, как правило, используется 5 конкатенации, как правило.
Comments