Страница: 1 |
|
Вопрос: Правда и мифы о StringBuilder
|
Добавлено: 20.12.06 22:05
|
|
Автор вопроса: Artyom
|
Гайдар Магдануров (MVP) еще раз рассказывает о скорости работы String и StringBuilder.
http://blogs.gotdotnet.ru/personal/gaidar/PermaLink.aspx?guid=C2F3AF10-950E-4D6E-9D14-D9A9CB0E71DC
Правда, стоит отметить, в приведенном выше примере, суммарное время на конкатенацию и вывод строки "стандартным методом" чуточку меньше, чем суммарное время при работе со StringBuilder :)
Ответить
|
Номер ответа: 4 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #4
|
Добавлено: 24.12.06 18:02
|
Гм, возможно Гайдар Магдануров опубликовал не совсем недостоверную информацию
Сейчас написал сам аналогичный бенчмарк, и получил совсем другие результаты - конкатенция на 10 000 строках работает 0.34 секунды, за это же время StringBuilder объединяет порядка 5 000 000 строк...
Dim S1 As DateTime = Now
Dim SB As New Text.StringBuilder
For i As Integer = 0 To 4000000
SB.Append("#"
Next
Dim S2 As DateTime = Now
Dim StringBuilderResult As String = SB.ToString
Dim S3 As DateTime = Now
Dim Str As String = ""
For i As Integer = 0 To 100
Str += "#"
Next
Dim S4 As DateTime = Now
MessageBox.Show(S2.Subtract(S1).ToString + ControlChars.CrLf + S3.Subtract(S2).ToString + ControlChars.CrLf + S4.Subtract(S3).ToString)
Если бы на GotDotNet.ru работали комментарии (а они после обновления движка уже несколько неделю не работают), то я бы уточнил этот вопрос у Гайдара.
По крайней мере он использовал какие-то другие средства подсчета быстродействия, отличные от моих, не исключено что различие заключается в этом.
Также не заметил чтоб StringBuilder.ToString работал "достаточно медленн" - даже быстрее конкатенции строк срабатывает.
Ответить
|
Номер ответа: 5 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #5
|
Добавлено: 24.12.06 18:08
|
Упс, прошу прощения, немного подпортил константы:
Dim S1 As DateTime = Now
Dim SB As New Text.StringBuilder
For i As Integer = 0 To 5000000
SB.Append("#"
Next
Dim S2 As DateTime = Now
Dim StringBuilderResult As String = SB.ToString
Dim S3 As DateTime = Now
Dim Str As String = ""
For i As Integer = 0 To 10000
Str += "#"
Next
Dim S4 As DateTime = Now
MessageBox.Show(S2.Subtract(S1).ToString + ControlChars.CrLf + S3.Subtract(S2).ToString + ControlChars.CrLf + S4.Subtract(S3).ToString)
Также замечено бОльшее падение производительности метода конкатенции при добавлении к строке более длинных строк, к примеру если добавляем строку длиной 30 символов, то получим:
StringBuilder (5 000 000): 4 c
String (10 000): 17 c
(при добавлении строк по 1 символу среднее время обоих примеров было порядка 0.3-0.4 с)
Вцелом надо произвести более точные исследования и установить при каких длинах строк и количествах объединений стоит использовать String, при каких - StringBuilder.
Ответить
|
Номер ответа: 6 Автор ответа: GSerg
Вопросов: 0 Ответов: 1876
|
Профиль | | #6
|
Добавлено: 24.12.06 19:14
|
It's well known that StringBuilders are an efficient way to concatenate strings. However, they are not always the best option. I've seen code use StringBuilders for every concatenation operation, and this is certainly not a wise choice.
StringBuilders are most efficient when you're concatenating a lot of strings, when the number of strings is unknown, and when the strings are long. However, if you're only concatenating a few strings or they're relatively short, standard concatenation is often a better choice. For this you can use either your language's chosen concatenation construct or String.Concat; these approaches will provide comparable performance. StringBuilders have associated overhead that standard strings don't have. Plus, at the end of the day, you have to turn the StringBuilder back into a string, which always incurs a cost.
So, just as with any performance optimization, you should test to see if the changes you're making are worth it. Consider a scenario in which you're appending a variable number of strings, each of which is 25 characters long. The graph in Figure 1 shows the results of a simple test I ran to determine how long it takes to append the specified number of 25-character strings to a StringBuilder and to a string. You'll notice that for this scenario, StringBuilder is clearly better after seven concatenations.
Ответить
|
Страница: 1 |
Поиск по форуму