PDA

Просмотр полной версии : StringBuilder или StringBuffer



Владимир Ситников
29.01.2016, 20:58
Внезапно поднялась тема про профилирование java.

Предыстория тут: http://www.owen.ru/forum/showthread.php?t=23191&p=194543&viewfull=1#post194543

Краткий перессказ тут: http://shipilev.net/blog/2015/voltmeter/

jmh: http://openjdk.java.net/projects/code-tools/jmh/


Гы, только обратил внимание, Вас на столько раздражает, что я ни принимаю jmh
Да. Без jmh замеры невозможны.


что в одном посте Вы меня учите кому чем не тыкать
Именно. Темой "StringBuilder vs StringBuffer" не тыкайте, пожалуйста.
TON'ом, PID'ом или ещё чем -- совсем другой вопрос.


а в другом намекаете что я пишу убожество? Меня вполне устраивает, что нет желтых подчеркиваний, findbugs не ругается
Нет, не намекаю.
Мои слова: "замер без jmh -- порнография". Остальное не обсуждалось и не подразумевалось. Да, я тоже за код без жёлтых подчёркиваний.
Но вот замерять что-то без JMH -- извольте.


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


добавлял -verbose:gc -Xms2g -Xmx2g помогло только StringBuffer улучшить скорость выполнения
Вот видите, это подтверждает то, что конкретный бенчмарк упирается не только в код классов Buffer/Builder, но и в сборку мусора.


и по поводу приведенного примера бенчмарка, слова Fork я так понимаю это что то связано с асинхронным выполнением задач, другими словами несколько потоков где преимущество имеет StringBuffer, может по этому он вровень идет
Нет, тут всё синхронно и ровно в один поток.
@Fork(3) заставляет jmh выполнять тест 3 раза. При этом для каждого теста java машина запускается 3 раза.
Это нужно для того, чтобы исключить случаи, когда "от запуска к запуску самой java машины" меняется результат. Такое бывает.

Если посмотрите логи, выполнений, то там видно, что каждый из тестов запускался 3*10*2=60 раз.

1-ый запуск jvm: 10 прогревочных запусков (они отбрасываются), 10 измерительных (по ним усредняем)
2-ый запуск jvm: 10 прогревочных запусков (они отбрасываются), 10 измерительных (по ним усредняем)
3-ий запуск jvm: 10 прогревочных запусков (они отбрасываются), 10 измерительных (по ним усредняем)

Т.е. итоговый результат -- усреднение по 30 запускам.

krollcbas
29.01.2016, 22:17
Понятно уже всем, что ребята Вы умные, программируете с пеленок.
Любым пиндосам нос утрете, если друг друга перед этим не съедите.
Зачем же здесь на форуме Овен?

Есть еще хороший форум, более в тему - http://www.cyberforum.ru

rovki
29.01.2016, 22:31
А так всегда -на новичков накидываются (дедовщина) .Выстоял -значит свой;),проходи ...Особенно когда кто нибудь не ординарное предлагает ,тут желающих пнуть много найдется :rolleyes:
Очень приятно ,что молодежь такая грамотная пошла(я про vladimirisitnikov) ,умеет не только программы писать ,но и четко ,по полочкам излагать свои мысли ..:rolleyes:

Владимир Ситников
29.01.2016, 22:38
А так всегда -на новичков накидываются

То, что "напряжение нужно измерять вольтметром" это "накидываются", "дедовщина"?
Или имелось ввиду про "накинулись на АСУ ТП в облаке"?

rovki
29.01.2016, 22:51
То, что "напряжение нужно измерять вольтметром" это "накидываются", "дедовщина"?
Или имелось ввиду про "накинулись на АСУ ТП в облаке"?
Ну да ....вроде началось с этого ,а потом понеслось ...

capzap
30.01.2016, 00:45
зайду по другому, есть исходники этих классов, первое они все расширяют класс AbstractStringBuilder, ну тут оппоненту это ни о чем не скажет, подумаешь название совпало
StringBuffer и его два из ... методов
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
public synchronized int length() {
return count;
}
StringBuilder и его два из ... методов
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
@Override
public int length() {
return count;
}
кроме того в StringBuilder есть append StringBuffer, в StringBuffer есть добавление только абстрактного AbstractStringBuilder

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

Владимир Ситников
30.01.2016, 12:48
Я не знаю какая магия ускоряет класс с большим количеством инструкций
Так ради этого java машинами и занимались 20 лет.
Не магия это, а JIT компиляция (https://ru.wikipedia.org/wiki/JIT-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D 0%B8%D1%8F).


поэтому продолжу верить своим способам проверки работы моего приложения, рекомендациям API

У меня один вопрос: других не будете тыкать за "использование buffer вместо builder"?

Владимир Ситников
30.01.2016, 12:51
зайду по другому, есть исходники этих классов,
Этот заход уже на порядок лучше, но смотреть нужно глубже.


в этом плане равенство выполнения по времени одинаково, остается только одна дополнительная инструкция нуления, плюсом затраты на синхронизацию если понадобится.
Именно из-за этого я и говорил, что нужно смотреть на ассемблерный код. Тут потенциальная разница всего в пару инструкций (если она вообще есть).
Частота процессора порядка 3ГГц, т.е. 3'000'000'000 инструкций. Вы тут сами говорите "одна дополнительная инструкция нуления", а процессор таких миллиарды в секунду сделать может.

Миних В.А.
30.01.2016, 13:01
Самое забавное во всей этой истории то, что я вообще не знаю откуда взялся этот кусок кода, который привел capzap (кстати, скрин куда то пропал). Я для блютуса вообще никогда код не писал)))
Уважаемый capzap, не поделитесь, откуда взялся этот кусок кода?

Владимир Ситников
30.01.2016, 13:06
Самое забавное во всей этой истории то, что я вообще не знаю откуда взялся этот кусок кода, который привел capzap (кстати, скрин куда то пропал). Я для блютуса вообще никогда код не писал)))
Уважаемый capzap, не поделитесь, откуда взялся этот кусок кода?
Тот пример был только для того, чтобы показать, что NetBeans рекомендует-таки, что "StringBuffer можно заменить на StringBuilder".

capzap
30.01.2016, 13:34
Так ради этого java машинами и занимались 20 лет.
Не магия это, а JIT компиляция (https://ru.wikipedia.org/wiki/JIT-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D 0%B8%D1%8F).



У меня один вопрос: других не будете тыкать за "использование buffer вместо builder"?

по поводу вопроса:https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html
A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations

по поводу машин, Ваше утверждение что классы выполняются одинаково я не оспариваю, показал же что код один и тот же, но как машина обращается к синхронизованным или нет классам, Ваш бенчмарк вряд ли проверяет, его задача подсчитать сколько времени тратится на инструкции, поэтому штатный анализатор показывает реальное время выполнения метода, а по нему билдер выигрывает в однопоточной задаче, о чем толкуют разработчики. К тому же я почему то не увидел простой установки jmh на виндузовую машину на офсайте, поэтому не получится Вас меня убедить в крутости бенчмарка
И на последок, не получится у вас заставить меня думать по другому, если мне не нравится творчество разработчика, ни за какие коврижки я не буду пользоваться его ПО

capzap
30.01.2016, 13:38
Самое забавное во всей этой истории то, что я вообще не знаю откуда взялся этот кусок кода, который привел capzap (кстати, скрин куда то пропал). Я для блютуса вообще никогда код не писал)))
Уважаемый capzap, не поделитесь, откуда взялся этот кусок кода?

вспомните обращение о редактировании ячеек таблицы через цифровую клавиатуру, к Вам на комп я точно не лазил, всё в свободном доступе

Миних В.А.
30.01.2016, 13:46
вспомните обращение о редактировании ячеек таблицы через цифровую клавиатуру, к Вам на комп я точно не лазил, всё в свободном доступе

Это что ли? ))
http://stackoverflow.com/questions/21987552/how-to-make-a-javafx-tableview-cell-editable-without-first-pressing-enter/22012798#22012798

Миних В.А.
30.01.2016, 13:57
Забавно. Я и забыл уже, что на стековерфлоу что то писал))

Scream
01.02.2016, 08:33
Забавно. Я и забыл уже, что на стековерфлоу что то писал))

да за вами наблюдают, уже наверное все пароли от кредиток есть.

Миних В.А.
01.02.2016, 13:21
да за вами наблюдают, уже наверное все пароли от кредиток есть.

Сбегал, поменял все карточки ))

capzap
02.06.2017, 13:09
Вот из-за таких как Шипелёв, наверное до сих пор всё стоит на месте :) https://vanilla-java.github.io/2017/04/13/String-Buffer-and-how-hard-it-is-to-get-rid-of-legacy-code.html

capzap
09.03.2018, 22:47
https://habrahabr.ru/company/skbkontur/blog/350800/ а где ...
Т.е. на JBreak всё же рассматривается метод StringBuilder

Владимир Ситников
09.03.2018, 23:49
https://habrahabr.ru/company/skbkontur/blog/350800/ а где ...
Т.е. на JBreak всё же рассматривается метод StringBuilder

Приходите уже на JPoint :)

Или, кстати, на Гейзенбаг (https://heisenbug-moscow.ru/). Может, есть желание и материал на тему "чему научить тестировщиков"?

capzap
10.03.2018, 07:29
Ява не основное мое направление, мне достаточно людей делавших Findbags, делающих sonarqube, профилировщик в среде, ну и тех кто посещает мероприятия и пишет после статьи