Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как "зачистить" StringBulider? зачистка StringBulider в начале цикла 
V
    Опции темы
mindflyer
Дата 16.8.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

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



Цитата(polosatij @  16.8.2007,  13:28 Найти цитируемый пост)
ага.. я тоже так делал, но когда в последний раз посмотрел бакткод, то был удивлён и больше этого не делаю, т.к. работаю на ява 6  smile  

Хм, но ведь компилятор не всё сможет оптимизировать, например, когда построение итоговой строки зависит от результатов работы функций. Типа:
Код

String result = "start";
if ( getBlaBlaBla() == 4 ) {
   result += "1";
   send(result);
} else {
   result += "2";
   write(result);
}


Или он и такие вещи умеет оптимизировать? Как-то не доверяю я возможностям оптимизации в сложных конструкциях smile Лучше уж в таких ситуациях по старинке, со StringBuilder'ом.
PM MAIL ICQ   Вверх
sergejzr
Дата 16.8.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



А что там сложного оптимизировать?
Код

StringBuffer result = new StringBuffer(); 
result.append("start");
if ( getBlaBlaBla() == 4 ) {
   result.append("1");
   send(result.toString());
} else {
    result.append("2");
   write(result.toString());
}

Цитата(nornad @  16.8.2007,  15:03 Найти цитируемый пост)
Напрасно. Никто ведь не гарантирует, что в java 7 эта оптимизация останется.

Она скорее даже ещё улучшится.

В любом случае "грязную рутинную работу" надо оставлять роботам - т.е компилятору. Лучше оптимизатора человек всё равно не соптимирует. 
А вот читабельность должна на первом месте стоять. 

Но конечно setLength(0); - самы быстрый вариант. И такое точно оптимизатор не возьмёт.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
COVD
Дата 16.8.2007, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Где-то в учебнике видел фразу, что StringBuilder - это несинхронизированная версия StringBuffer' а . Примерно также соотносятся, как Vector и ArrayList. Просто и понятно. А прочитав эту дискуссию, так ничего и не понял. Как же лучше складывать строки в java 6? (в байт код не отсылайте smile )
PM MAIL   Вверх
sergejzr
Дата 16.8.2007, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



COVD, плюсом.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
w1nd
Дата 16.8.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(sergejzr @  16.8.2007,  23:20 Найти цитируемый пост)
COVD, плюсом.

Только не в циклах.

Цитата(polosatij @ 15.8.2007,  20:26)
у тебя пробел в образовании..  smile  это было так раньше smile , сейчас уже всё по другому.. посмотри байткод явы 6 (и думаю такое же будет в ява 5) smile

Я бы с радостью восполнил пробел в образовании, если бы он был smile

Упомянутая вами "оптимизация" имела место ещё в версии 1.4.0 (возможно и в более ранних, я не интересовался). И заключается она _только_ в подмене операций со строками на операции со StringBuffer'ом (до 1.5) или StringBuilder'ом. Это я за оптимизацию не считаю вовсе.

Конкатенация строк вида 
Код
String s2 = s1 + "2";

преобразуется компилятором в код, создающий два-три (зависит от ситуации) _лишних_ объекта. При этом расходуется _как минимум_ в полтора раза больше памяти, чем при использовании StringBuilder'а. Именно эта "оптимизация", помещённая в цикл, и приводит к огромным потерям времени и значительным потерям памяти _впустую_.

З. Ы. Особенно времени. Дополнение StringBuilder'а (каждый может написать для себя простенький тест, дабы убедиться воочию) быстрее конкатенации строк (якобы оптимизируемой) в _тысячи раз_.

Это сообщение отредактировал(а) w1nd - 16.8.2007, 23:41


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
COVD
Дата 16.8.2007, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

Только не в циклах.


Тогда везде бы надо StringBuilder использовать. Надо ли понимать так, что str1+str2 - это наглядно и потому хорошо, но в цикле это большая роскошь. 
PM MAIL   Вверх
w1nd
Дата 16.8.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(COVD @  16.8.2007,  23:36 Найти цитируемый пост)
Надо ли понимать так, что str1+str2 - это наглядно и потому хорошо, но в цикле это большая роскошь. 

 smile 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
mindflyer
Дата 16.8.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

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



Цитата(sergejzr @  16.8.2007,  23:02 Найти цитируемый пост)
В любом случае "грязную рутинную работу" надо оставлять роботам - т.е компилятору. Лучше оптимизатора человек всё равно не соптимирует. 
А вот читабельность должна на первом месте стоять. 

Согласен (иногда бывает наоборот, но речь не об этом). Современный java-компилятор (6-ой, 5-ый...) действительно умеет делать такие оптимизации, как ты привёл в коде?
PM MAIL ICQ   Вверх
w1nd
Дата 17.8.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(mindflyer @  16.8.2007,  23:59 Найти цитируемый пост)
Согласен (иногда бывает наоборот, но речь не об этом). Современный java-компилятор (6-ой, 5-ый...) действительно умеет делать такие оптимизации, как ты привёл в коде?

Такие не умеет. И, смею предположить, не сумеет никогда. Просто на месте каждого сложения будет создан StringBuilder, вызван append, и результат обратно в переменную с помощью toString().

Это сообщение отредактировал(а) w1nd - 17.8.2007, 11:50


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Shaggie
Дата 17.8.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



На свежую голову провёл эксперимент.
Код

String a = "hi";
String b = "all";
String c = a+b; // компилируется в String c = new StringBuilder().append(a).append(b).toString();

В то время как
Код

String a = "hi";
String b = "all";
String c = new StringBuilder(a).append(b).toString();

экономит три байта и лишний вызов метода append()

Вот такая мелочная оптимизация.

Особенно забавно, что мы не знаем, как реализованы вызовы конструкторов StringBuilder - какой из них эффективнее  smile 


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
nornad
Дата 17.8.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(sergejzr @  17.8.2007,  02:02 Найти цитируемый пост)
Лучше оптимизатора человек всё равно не соптимирует.

Да ну? Совершенно не согласен. smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
sergejzr
Дата 17.8.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Цитата(nornad @  17.8.2007,  12:10 Найти цитируемый пост)
Да ну? Совершенно не согласен. smile 

Вместо "лучше" следовало бы написать "эффективнее". Это true.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
nornad
Дата 17.8.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



sergejzr, всё равно не согласен. Человек способен оптимизировать куда лучше и эффективнее, чем любой компилятор, оптимизатор и иже с ними. А вот то, что человек затратит на это куда больше времени - это уже как раз true.
То есть, оптимизация выходит у человека эффективнее, но сам процесс оптимизирования у него неэффективен. smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
sergejzr
Дата 18.8.2007, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Цитата(nornad @  17.8.2007,  15:28 Найти цитируемый пост)
sergejzr, всё равно не согласен. Человек способен оптимизировать куда лучше и эффективнее, чем любой компилятор, оптимизатор и иже с ними.

 А что есть по Вашему эффективность?  Уж время это один из главных влияющих факторов. И кто этот абстрактный "человек"? Если среднего программиста взять, то точно оптимизатор лучше, а если крутого, то его сперва надо взять где-то, да и он наврядли будет оптимизировать ваш код. А зачем нам учитывать теоретическую эффективность, которая не может быть достигнута на практике?
ПС:
Не стоит придираться к словам. И так понятно, что имеется ввиду, а то - уходим от темы.




Цитата(w1nd @  17.8.2007,  10:49 Найти цитируемый пост)
Такие не умеет. И, смею предположить, не сумеет никогда.

Да, действительно (проверил дисассемблером). Ява оптимизатор оказывается и правда ещё в младенческом возрасте находится. 

Насчёт не сумеет никогда - я бы сомневался. Конструкция не очень тяжёлая. Её возможно даже препроцессором (заменой выражений "побуквенно") можно взять (если бы он у явы был smile) )


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
nornad
Дата 18.8.2007, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Под эффективностью я понимал то, что человек может оптимизировать код так, что он (код) после этой процедуры будет эффективнее. Эффективность кода и эффективность процесса оптимизации кода - разные вещи. Думаю, теперь мы разобрались с тем, кто и что имел в виду.

А по поводу уровня "человека" могу сказать то, что объективно нет такого понятия как "средний программист". Так же, как нет и других категорий. Потому что вообще ничего объективного у нас нет. Но это я уже ударился в совсем иные сферы бытия.
Кто же может оптимизировать лучше, чем некий обобщённый оптимизатор? Знамо дело - умный и усидчивый, имеющий достаточно знаний и стимул для этого.
Если вы, уважаемый, работали с ассемблером, то посмотрев на скомпилированный код любого приложения вы сможете заметить хотя бы пару мест, где можно было бы оптимизировать.
Ну и думаю, без объяснений понятно, что человек сначала даст возможность показать себя оптимизатору, а потом уже при необходимости сам полезет оптимизировать. Так и время экономится, и оптимизация увеличивается, если это необходимо.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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