Предположим, у меня есть строитель строк в C #, который делает это:
StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();
будет ли это так же эффективно или более эффективно, как если бы:
string cat = "cat";
string s = String.Format("The {0} in the hat", cat);
Если так, то почему?
РЕДАКТИРОВАТЬ
После некоторых интересных ответов я понял, что, вероятно, мне следовало бы немного яснее понять, о чем я спрашиваю. Я не столько спрашивал, что быстрее при конкатенации строки, но что быстрее при вводе одной строки в другую.
В обоих случаях выше я хочу вставить одну или несколько строк в середину предопределенной строки шаблона.
Извините за путаницу
string s = "The "+cat+" in the hat";
может быть самым быстрым, если он не используется в цикле, и в этом случае самый быстрый будет сStringBuilder
инициализированным вне цикла.Ответы:
ПРИМЕЧАНИЕ. Этот ответ был написан, когда .NET 2.0 была текущей версией. Это может больше не применяться к более поздним версиям.
String.Format
используетStringBuilder
внутренне:Приведенный выше код является фрагментом из mscorlib, поэтому вопрос становится «
StringBuilder.Append()
быстрее, чемStringBuilder.AppendFormat()
»?Без бенчмаркинга я бы сказал, что приведенный выше пример кода будет работать быстрее при использовании
.Append()
. Но это предположение, попробуйте сравнительный анализ и / или профилирование двух, чтобы получить правильное сравнение.Этот парень, Джерри Диксон, провел несколько тестов:
Обновлено:
К сожалению, ссылка выше с тех пор умерла. Однако на Путь назад машина все еще есть копия:
В конце концов, это зависит от того, будет ли форматирование строки вызываться многократно, т. Е. Выполняется ли серьезная обработка текста более чем в сотнях мегабайт текста, или же он вызывается, когда пользователь время от времени нажимает кнопку. Если вы не выполняете какую-то огромную работу по пакетной обработке, я бы придерживался String.Format, это способствует удобочитаемости кода. Если вы подозреваете узкое место перфорации, прикрепите профилировщик к своему коду и посмотрите, где он на самом деле.
источник
.ToString()
наStringBuilder
объекте. На протяжении многих итераций это время имеет большое значение и означает, что он не совсем сравнивает яблоки с яблоками. Вот почему он демонстрирует такие отличные результатыStringBuilder
и, вероятно, объясняет его удивление. Я просто повторил тест с исправлением этой ошибки и получил ожидаемые результаты:String
+
оператор был самым быстрым, а затемStringBuilder
, сString.Format
замыкающим.Из документации MSDN :
источник
Я провел несколько быстрых тестов производительности, и для 100 000 операций, усредненных за 10 прогонов, первый метод (String Builder) занимает почти половину времени второго (String Format).
Так что, если это нечасто, это не имеет значения. Но если это обычная операция, вы можете использовать первый метод.
источник
Я ожидаю, что String.Format будет медленнее - он должен проанализировать строку и затем объединить ее.
Пара заметок:
источник
Я думаю, что в большинстве случаев именно эта ясность, а не эффективность, должна быть вашей главной заботой. Если вы не соберете кучу струн или не создадите что-то для мобильного устройства с низким энергопотреблением, это, вероятно, не сильно повлияет на скорость вашего бега.
Я обнаружил, что в случаях, когда я строю строки довольно линейно, лучше всего использовать прямую конкатенацию или использование StringBuilder. Я предлагаю это в тех случаях, когда большая часть создаваемой вами строки является динамической. Поскольку очень мало текста является статичным, самое важное - это то, что ясно, куда помещается каждый фрагмент динамического текста, на случай, если он нуждается в обновлении в будущем.
С другой стороны, если вы говорите о большом фрагменте статического текста с двумя или тремя переменными в нем, даже если он немного менее эффективен, я думаю, что ясность, которую вы получаете от string.Format, того стоит. Я использовал это ранее на этой неделе, когда мне нужно было разместить один бит динамического текста в центре 4-страничного документа. Будет проще обновить этот большой кусок текста, если он будет одним куском, чем обновлять три куска, которые вы объединяете вместе.
источник
Хотя бы потому, что string.Format точно не делает то, что вы думаете, вот повторный тест 6 лет спустя на Net45.
Concat по-прежнему самый быстрый, но на самом деле разница составляет менее 30%. StringBuilder и Format отличаются лишь на 5-10%. Я получил вариации в 20%, выполняя тесты несколько раз.
Миллисекунды, миллион итераций:
Урок, который я извлекаю, состоит в том, что разница в производительности тривиальна, и поэтому она не должна мешать вам писать простейший код, который вы можете прочитать. Что за мои деньги часто, но не всегда
a + b + c
.источник
String.Format использует
StringBuilder
внутренне ... настолько логично, что приводит к мысли, что он будет немного менее производительным из-за больших накладных расходов. Тем не менее, простая конкатенация строк является самым быстрым способом внедрения одной строки между двумя другими ... в значительной степени. Это доказательство было продемонстрировано Рико Мариани в его самой первой викторине, несколько лет назад. Простой факт заключается в том, что конкатенации ... когда известно количество частей строки (без ограничений ... вы можете объединить тысячу частей ... если вы знаете, что это всегда 1000 частей) ... всегда быстрееStringBuilder
или String. Формат. Они могут быть выполнены с одним выделением памяти для серии копий памяти. Вот доказательствоА вот фактический код для некоторых методов String.Concat, которые в конечном итоге вызывают FillStringChecked, который использует указатели для копирования памяти (извлекается через Reflector):
Итак, тогда:
Наслаждайтесь!
источник
О, также, самый быстрый будет:
источник
StringBuilder
которой, прежде всего, оптимизируется этот тип кодирования.Это действительно зависит. Для небольших строк с небольшим количеством конкатенаций на самом деле быстрее просто добавлять строки.
Но для больших строк (очень очень больших строк) тогда более эффективно использовать StringBuilder.
источник
В этом случае я бы предложил String.Format - самый быстрый, потому что он предназначен именно для этой цели.
источник
Это действительно зависит от вашей модели использования.
Подробный тест между
string.Join
,string,Concat
иstring.Format
можно найти здесь: String.Format не подходит для интенсивного ведения журналаисточник
Я бы посоветовал не делать этого, поскольку String.Format не был предназначен для объединения, он был предназначен для форматирования вывода различных входных данных, таких как дата.
источник