Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StringBuilder. Как работает быстрее? Append 
:(
    Опции темы
Pankon
Дата 27.11.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Какой вариант работает быстрее?
1
Код

                Dim sbBuff As New StringBuilder
                sbBuff.Append("w")
                sbBuff.Append("r")

2
Код

                Dim sbBuff As New StringBuilder
                sbBuff.Append("w" & "r")

PM MAIL   Вверх
Naum
Дата 27.11.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



2 вариант быстрее.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.11.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Первый быстрее. Во втором варианте юзается сцепка двух обычных строк, а результат цепляется в StringBuilder. В первом варианте строки цепляются в StringBuilder напрямую. Для обычного StringBuilder-а эта операция занимает почти нулевое время т.к. работа идёт с уже выделенным буфером под строку; обычная же сцепка двух строк приводит к созданию третьей строки - лишний оверхед.


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 27.11.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Код

int length = 1000000;
            int wordsLength = 10;
            StringBuilder sbBuff;
            string word1 = "".PadLeft(wordsLength);

            string word2 = "".PadLeft(wordsLength);

            DateTime startTime = DateTime.Now;
            for (int i = 0; i < length; i++)
            {
                sbBuff = new StringBuilder(2 * wordsLength);
                sbBuff.Append(word1);
                sbBuff.Append(word2);
            }
            Console.WriteLine(((TimeSpan)(DateTime.Now - startTime)).Ticks);

            startTime = DateTime.Now;
            for (int i = 0; i < length; i++)
            {
                sbBuff = new StringBuilder(2 * wordsLength);
                sbBuff.Append(word1 + word2);
            }
            Console.WriteLine(((TimeSpan)(DateTime.Now - startTime)).Ticks);

            Console.ReadKey();


Значится так:
Почти всегда, второй вариант медленнее, первого.
На маленьких словах они почти рядом. 
Чем больше длинна слова, тем второй больше отрывается от первого (останавливается при достижении почти 2-х кратного преимущества).
Если из конструктора убрать начальную "мощность" builder-a, то разница сокращается, но все равно первый медленнее

PM MAIL WWW ICQ   Вверх
Pankon
Дата 27.11.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



ivashkanet, а какой результат если убрать из конструктора размер буфера т.е не 
sbBuff = new StringBuilder(2 * wordsLength);
а
sbBuff = new StringBuilder();

 smile 

ПС В своей проге я не знаю конечный размер строки...
PM MAIL   Вверх
Exception
Дата 27.11.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



user posted image

http://msdn.microsoft.com/library/default..../vbnstrcatn.asp

Добавлено @ 16:41 
http://www.heikniemi.net/hc/archives/000124.html

Добавлено @ 16:42 
При количестве итераций < 10 эффекта вообще ноль, кстати.
PM   Вверх
DarkDragon
Дата 28.11.2006, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Цитата(Pankon @  27.11.2006,  15:53 Найти цитируемый пост)
ivashkanet, а какой результат если убрать из конструктора размер буфера т.е не 
sbBuff = new StringBuilder(2 * wordsLength);
а
sbBuff = new StringBuilder();


Там вообщем о capacity?
Поправьте если я ошибаюсь.
Помнится мне что это стартовое количество элементов, если его не назначить то у него там в конструкторе начальный есть(4 что ли?).

Если ты задашь capacity в размер строки, то он не будет переопределять массив, в который он кидает значения. Если буфер уже заполнен то он будет переопределять размер массива, а на это тоже уходит время.

PM MAIL   Вверх
Pankon
Дата 28.11.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(DarkDragon @  28.11.2006,  08:22 Найти цитируемый пост)
будет переопределять размер массива, а на это тоже уходит время
 вот это и интересно сравнить с аналогичной работой строк

PM MAIL   Вверх
ivashkanet
Дата 28.11.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Pankon, возьми и сравни.

P.S. Принцип работы такой: Есть билдер мощности 100, например.
В нем занято 50 под строку. Остальные --- пустые, в резерве.
Если мы не перевалим через 100, то новые строки будут добавляться прямо в зарезервированное пространство  билдера.
Как только нам не будет хватать нашей сотни, размер билдера увеличится в 2 раза (станет 200) и т.д.

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

Как уже сказал DarkDragon, начальное значение мощности -- 4, но можно его задать самостоятельно. 
Если ты не знаешь нужного тебе размера, то можно его прикинуть, зная что каждая неиспользованная "ячейка" тянет 4 байта и перевыделение идет двухкратными скачками.
PM MAIL WWW ICQ   Вверх
Djuffin
Дата 28.11.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

Репутация: 1
Всего: 2



Если компилятор не тупой (а он не тупой), то 
Код
"w" & "r"
 вычисляется во время компиляции (возможно JIT). И тогда второй вариант быстрее.
PM MAIL   Вверх
ivashkanet
Дата 28.11.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Djuffin, это просто пример, который показывает разные концепции составления строк smile
PM MAIL WWW ICQ   Вверх
DarkDragon
Дата 28.11.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Цитата(Djuffin @  28.11.2006,  13:30 Найти цитируемый пост)
 вычисляется во время компиляции (возможно JIT). И тогда второй вариант быстрее. 

Если JIT, то что если запретить JIT? Или это происходит когда компилим проект?
PM MAIL   Вверх
Exception
Дата 28.11.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Не удержался и проверил. Да,

Код

Console.WriteLine("Hello, " + "world!")


компилируется в 

Код

Console.WriteLine("Hello, world!")



Цитата(DarkDragon @  28.11.2006,  17:59 Найти цитируемый пост)

Если JIT, то что если запретить JIT? Или это происходит когда компилим проект? 


Это делает сам компилятор. JIT тут вообще ни при чём.
PM   Вверх
ivashkanet
Дата 28.11.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Exception @  28.11.2006,  16:45 Найти цитируемый пост)
Console.WriteLine("Hello, " + "world!")

Оно-то, конечно , прикольно, но, ИМХО, никто в здравом уме такое не напишет smile
PM MAIL WWW ICQ   Вверх
Exception
Дата 28.11.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Я говорю лишь о том, что компилятор, естественно, оптимизирует енто (тут сомневались):

Цитата(DarkDragon @  28.11.2006,  17:59 Найти цитируемый пост)
Цитата(Djuffin @  28.11.2006,  13:30 Найти цитируемый пост)
 вычисляется во время компиляции (возможно JIT). И тогда второй вариант быстрее. 

Если JIT, то что если запретить JIT? Или это происходит когда компилим проект? 


PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.