Конкатенация строк, небезопасная в C#, должен использовать StringBuilder?

index просто описывает, какой файл обслуживать по умолчанию. Вам нужно ключевое слово root:

location /docs {
    root /path/to/another/index;
    index filename.html;
}

Теперь веб-сервер будет обслуживать /path/to/another/index/filename.html при доступе к маршруту / документам /.

5
задан Bryan Roach 22 April 2009 в 20:25
поделиться

8 ответов

Помимо того, что вы Это, вероятно, лучше всего делать с помощью API-интерфейсов XML вместо строк или StringBuilder. Я сомневаюсь, что ошибка, которую вы видите, связана с конкатенацией строк. Возможно, переключение на StringBuilder просто замаскировало ошибку или изящно обошло ее, но я сомневаюсь, что использование строк действительно было причиной.

7
ответ дан 18 December 2019 в 05:29
поделиться

Чтобы ответить на ваш вопрос: String contatenation in C# (and .NET in general) is "safe", but doing it in a tight loop as you describe is likely to cause severe memory pressure and put strain on the garbage collector.

I would hazard a guess that the errors you speak of were related to resource exhaustion of some sort, but it would be helpful if you could provide more detail — for example, did you receive an exception? Did the application terminate abnormally?

Background:

string a = "aaa";
string b = "bbb";
string c = "ccc";
// ...
string temp1 = "aaabbb";
string temp2 = "aaabbbccc";
string temp3 = "aaabbbcccddd";
string temp4 = "aaabbbcccdddeee";
string temp5 = "aaabbbcccdddeeefff";
string temp6 = "aaabbbcccdddeeefffggg";
// ...

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

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

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

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

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

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

15
ответ дан 18 December 2019 в 05:29
поделиться

Конкатенация строк безопасна, хотя и требует больше памяти, чем использование StringBuilder, если используется большое количество строк в цикле. А в крайних случаях у вас может не хватить памяти.

Это почти наверняка ошибка в вашем коде.

Возможно, вы связываетесь с очень большим количеством строк. Или, может быть, это что-то совершенно другое.

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

11
ответ дан 18 December 2019 в 05:29
поделиться

Сколько времени займет версия конкатенации и версия компоновщика строк? Возможно, ваше соединение с БД закрыто. Если вы делаете много конкатенации, я бы пошел с StringBuilder, поскольку это немного более эффективно.

3
ответ дан 18 December 2019 в 05:29
поделиться

string.Concat (string []) - самый быстрый способ объединения строк. Он убивает StringBuilder в производительности при использовании в циклах, особенно если вы создаете StringBuilder в каждой итерации. Есть множество ссылок, если вы Google "формат строки c # против stringbuilder" или что-то в этом роде. http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx дает вам представление о времени. Здесь string.Join выигрывает тест конкатенации, но я верю, что это потому, что string.Concat (string, string) используется вместо перегруженной версии, которая принимает массив. Если вы посмотрите на код MSIL, который генерируется различными методами, вы увидите, что происходит под капотом.

1
ответ дан 18 December 2019 в 05:29
поделиться

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

Другая возможная причина - длина строки это int, поэтому максимально возможная длина равна Int32.MaxValue или 2 147 483 647.

В любом случае StringBuilder лучше, чем "string1 + string2" для этого типа операции. Хотя использование встроенных возможностей XML было бы еще лучше.

1
ответ дан 18 December 2019 в 05:29
поделиться

Вот мой выстрел в темноте ...

Строки в .NET (не в строителях) входят в внутренний пул строк. Это в основном область, управляемая CLR для совместного использования строк для повышения производительности. Здесь должен быть какой-то предел, хотя я понятия не имею, что это за предел. Я полагаю, что все ваши конкатенации - это попадание в потолок струнного пула. Так что SQL говорит да, у меня есть значение для вас, но он нигде не может его поместить, поэтому вы получите исключение.

Быстрая и простая проверка состояла бы в nGen вашей сборке и в поиске ошибки. После nGen'ing ваше приложение больше не будет использовать пул.

Если это не удастся, я бы связался с Microsoft, чтобы попытаться получить некоторые подробности. Я думаю, что моя идея звучит правдоподобно, но я понятия не имею, почему она работает в режиме отладки. Возможно, в режиме отладки строки не интернированы. Я тоже не эксперт.

0
ответ дан 18 December 2019 в 05:29
поделиться

При объединении строк я всегда использую StringBuilder. Он разработан для этого и более эффективен, чем просто использование "string1 + string2".

-3
ответ дан 18 December 2019 в 05:29
поделиться
Другие вопросы по тегам:

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