Конкатенация строк по сравнению со Строковым Разработчиком. Производительность

Отсортируйте данные (или копия данных) непосредственно и создайте список dicts впоследствии. Вид с помощью функции, отсортированной с appropiate ключевой функцией (operator.attrgetter, вероятно)

28
задан Jorge Córdoba 23 October 2009 в 11:22
поделиться

8 ответов

Обычный ответ: конкатенация строк более эффективна для от 4 до 8 строк. Это зависит от того, чей блог вы читаете.

Не пишите тест, чтобы решить, какой метод использовать. Если вы не уверены, превысит ли он магический предел, просто используйте StringBuilder.

Запустите этот код, чтобы увидеть результаты сами:

const int sLen=30, Loops=5000;
DateTime sTime, eTime;
int i;
string sSource = new String('X', sLen);
string sDest = "";
// 
// Time string concatenation.
// 
sTime = DateTime.Now;
for(i=0;i<Loops;i++) sDest += sSource;
eTime = DateTime.Now;
Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");
// 
// Time StringBuilder.
// 
sTime = DateTime.Now;
System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1));
for(i=0;i<Loops;i++) sb.Append(sSource);
sDest = sb.ToString();
eTime = DateTime.Now;
Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");
// 
// Make the console window stay open
// so that you can see the results when running from the IDE.
// 
Console.WriteLine();
Console.Write("Press Enter to finish ... ");
Console.Read();

Ref. http://support.microsoft.com/kb/306822

36
ответ дан 28 November 2019 в 02:55
поделиться

Я поддерживаю идею сохранять вещи простыми до тех пор, пока у вас не будет веской причины сделать их сложными.

Для чего-то вроде 2-5 элементов нет смысла использовать StringBuilder (если вы не повторять это соединение непрерывно). Лучше читаемый синтаксис «+ =» имеет большее значение.

14
ответ дан 28 November 2019 в 02:55
поделиться

Более общий взгляд на вопрос может заключаться в следующем: сколько строк достаточно, чтобы прекратить объединение и начать построение?

Это зависит от длины строк и от того, можете ли вы предсказать цель length , тогда вы должны указать длину конструктору StringBuilder , и если вы объедините их все сразу или в несколько шагов.

Если вы объедините их сразу (например, s = "A" + "b" + "c" + "d" ) то использование StringBuilder , вероятно, никогда не имеет смысла.

Если вы можете точно предсказать, length, то даже для 3 строк StringBuilder будет быстрее.

Обычно StringBuilder работает быстрее, если у вас более 5 конкататов.Но даже в этом случае простое объединение строк обычно имеет небольшие накладные расходы (если только оно не выполняется в плотном цикле).

Как только вы достигнете 10 конкатенаций, использование StringBuilder , вероятно, будет благоприятным.

Изменить: Просто чтобы прояснить: в вашем случае вы должны явно отказаться от StringBuilder .

5
ответ дан 28 November 2019 в 02:55
поделиться

Конкатенация строк IMO более читабельна. Вы используете + и + = вместо strBldInstance.Add (), что может немного запутать код,

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

3
ответ дан 28 November 2019 в 02:55
поделиться

Если вы можете оценить количество байтов, которые будут использоваться для полной строки (и использовать это для инициализации емкости StringBuilder), StringBuilder, вероятно, превзойдет класс String, если сделает больше, чем примерно 3 конката.

0
ответ дан 28 November 2019 в 02:55
поделиться

Я бы использовал StringBuilder только потому, что вы хотите обеспечить единообразие во всем приложении. Создание экземпляра объекта Java / .NET также не занимает много времени, хотя я предполагаю, что при настройке StringBuilder потребуется некоторая уборка. Конечно, не намного хуже, чем создание нескольких объектов String посредством конкатенации.

0
ответ дан 28 November 2019 в 02:55
поделиться

Если вы можете, вы могли бы немного повеселиться и полностью отказаться от цикла for и использовать агрегат?

var concatstring = mylist.Aggregate("", (acc, item) => acc + "." + item);

Но не уверены в накладных расходах?

0
ответ дан 28 November 2019 в 02:55
поделиться

Построитель строк, скорее всего, будет немного быстрее в этом случае, но на самом деле этого, вероятно, будет недостаточно для беспокойства. На самом деле это будет зависеть от двух вещей: количества раз, которое вы воссоздаете строку (потому что строки неизменяемы и объединение приводит к созданию новой строки из двух существующих) и размера строковых элементов, которые вы соединяются вместе. Объединение пяти строк, каждая по 2 байта, будет сильно отличаться от объединения 5 строк, каждая по 5000 байтов каждая, потому что чем длиннее строка, тем больше работы необходимо выполнить системе для выделения памяти и объектов сборки мусора, которые не являются дольше в использовании. Конструктор строк - лучший вариант, потому что он уже оптимизирован для соединения строк вместе, а вы этого не делаете. Мне действительно нужно беспокоиться о соображениях производительности.

Имея в виду все это, если вы знаете, насколько большим будет конечный размер строки final, конструктор строк почти наверняка будет быстрее. Когда вы сообщаете ему, сколько памяти выделить для последней строки, ему не нужно будет выполнять процесс перераспределения памяти.

0
ответ дан 28 November 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: