Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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 :)

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 24.12.06 10:43
На самом деле StringBuilder рулит при боьшом кол-ве конкатенаций.
Если нужно просто собрать строку из 10-20 частей, то не надо париться
со StringBuilder.

Ответить

Номер ответа: 2
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #2 Добавлено: 24.12.06 15:11
Более того, если нужно собрать строку из 10 000 частей, то все равно не надо париться со StringBuilder :)

Ответить

Номер ответа: 3
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 24.12.06 15:36
Ну не скажи.. Помнишь, в kmap когда конкатенацию на 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.

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 24.12.06 20:55
Что за источник информации?

Ответить

Номер ответа: 8
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #8 Добавлено: 25.12.06 10:35
Статья то ли из MSDN mag, то ли из TechNet, не помню точно.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам