powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Ускорение StringBuilder
25 сообщений из 66, страница 1 из 3
Ускорение StringBuilder
    #38942114
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть
StringBuilder sf = new StringBuilder(250000);
в цикле он заполняется примерно так
sf.append("лялялялялялялял).append(String)
.append(int)
.append("d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh")
и т.д.
длина sf может быть различна
максимальная длина заполняется 50мс
можно как-либо ускорить?
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942123
YamahaR1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Никак, AFAIK chain append наиболее эффективный в данном случае.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942124
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Можно поэкспериментировать с char[]. Но выгода будет далеко не всегда.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942163
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если тут
.append("d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh")

"d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh" заменить на константу finaly , будет какой-то смысл?
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942168
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесли тут
.append("d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh")

"d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh" заменить на константу finaly , будет какой-то смысл?
Нет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире. Почему именно это место вызывает проблему? Какая задача решается? Заполнение шаблона или что-то ещё? Почему её нужно оптимизировать, а не, например, распараллелить?
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942279
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесть
StringBuilder sf = new StringBuilder(250000);
в цикле он заполняется примерно так
sf.append("лялялялялялялял).append(String)
.append(int)
.append("d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh")
и т.д.
длина sf может быть различна
максимальная длина заполняется 50мс
можно как-либо ускорить?
StringBuilder практически невозможно ускорить. Он достаточно хорош для 99% случаев.
Но можно посмотреть алгоритм которые его обрамляет и поставить вопрос с другого ракурса.
Для чего нужно с огромной скоростью фабриковать строки? Что дальше с ними делать?
Где тот process-consumer который сможет их так-же быстро заглатывать?
Сможет-ли вообще?
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942475
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире.
из базы приходит N записей в ResultSet
из них нужно сформировать строку содержащую html код таблицы с заполненной данными из ResultSet
когда данных мало - летает.
но есть наборы дофига строк....
это, конечно не правильно, и я против того чтоб на клиента гнать стока записей, но это тот случай, когда это как-бы ну....
можно и на клиенте сфомировать саму таблицу, но сервер быстрее...
тут конечно и на передачу по сети (правда локальной) время идет...
вот така проблемка
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942510
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
вадя, и вы уверены, что дело именно в StringBuilder? Крайне сомнительно.
Как замеряли? Менять statement.setFetchSize(int rows) пробовали?
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942530
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя....
из базы приходит N записей в ResultSet

Сомневаюсь, что в данном случае будет тормозить StringBuilder.

Сейчас посмотрел на исходники на grepcode.com , выделение памяти достаточно не эффективно. Всегда ровно под размер добавляемой строки увеличивает. Можно, в принципе:

1. Сделать свою процедуру (типа fastAppend) и оптимизировать выделение памяти (заранее перед вызовом append добавлять память большими кусками через ensureCapacity).
2. Периодически, например перед обработкой каждой строки докидывать в StringBuilder достаточно большой объем памяти.

В общем, если grepcode.com не врет, вырвать руки и ноги тем, кто StringBuilder писал. И переставить местами. Что у них руки сразу торчали из того места, откуда следует (т.е. из пятой точки).

To All: а почему авторы JRE любят классы делать final? Нафига?
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942535
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.s. Первую строчку в пред. сообщение удалить. Вроде, судя по исходникам, StringBuilder сделан через одно место ((( Действительно ДОЛЖЕН тормозить и не по детски. Тесты не писал и не проверял, пускай этим автор топика заморачивается.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942552
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
авториз базы приходит N записей в ResultSet
....
когда данных мало - летает.
но есть наборы дофига строк....
...
вот така проблемка

Вадя, на твой вопрос есть два варианте ответа - плохой и матерный.
Дам плохой ответ.
Оставь в покое, по возможности навсегда , StringBuilder.

Уточнение - ни в коем случае не оставляй в покое и обязательно усовершенствуй StringBuilder (например, по советам Leonid Kudryavtsev ), если другого занятия ты для себя придумать не можешь.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942554
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vslвадя, и вы уверены, что дело именно в StringBuilder? Крайне сомнительно.
Как замеряли? Менять statement.setFetchSize(int rows) пробовали?
измеряю так
long start = System.nanoTime();
............................
System.out.println("time " + (System.nanoTime() - start));

StringBuilder один из моментов,
statement.setFetchSize(int rows) пока не пробывал, не дошёл.
оптимизирую по кускам.
автор1. Сделать свою процедуру (типа fastAppend) и оптимизировать выделение памяти (заранее перед вызовом append добавлять память большими кусками через ensureCapacity).
у меня вроде для выделения памяти есть заранее
StringBuilder sf = new StringBuilder(250000);
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942560
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Сейчас посмотрел на исходники на grepcode.com , выделение памяти достаточно не эффективно. Всегда ровно под размер добавляемой строки увеличивает.

Это если каждый раз добавлять строку, которая длиннее sb в 2 раза+2. int newCapacity = (value.length + 1) * 2;
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942566
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

автороптимизирую по кускам.
ты не по тем кускам оптимизируешь.
у тебя нет права ждать результата от оптимизации куска, выбранного путем тыканья пальца в позапрошлогодний снег.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942567
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяавторНет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире.
из базы приходит N записей в ResultSet
из них нужно сформировать строку содержащую html код таблицы с заполненной данными из ResultSet


Вопрос ребром: зачем формировать ответ целиком в памяти, почему не отдавать на клиент частями?

Типа такого:
Код: java
1.
2.
3.
4.
5.
resultSet = ...
...
writer.write("<tr><td>...");
writer.write(resultSet.getString(1);
writer.write("</td></tr>...");
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942589
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяавторНет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире.
из базы приходит N записей в ResultSet
из них нужно сформировать строку содержащую html код таблицы с заполненной данными из ResultSet
когда данных мало - летает.
но есть наборы дофига строк....
это, конечно не правильно, и я против того чтоб на клиента гнать стока записей, но это тот случай, когда это как-бы ну....
можно и на клиенте сфомировать саму таблицу, но сервер быстрее...
тут конечно и на передачу по сети (правда локальной) время идет...
вот така проблемка
Да, тут простор для оптимизиации нереальный.

1. Нафига тут String/StringBuilder вообще? Гнать потоком все данные через Writer или даже OutputStream прямо в отклик.
2. Можно, конечно, завести огромный массив, забитый пробелами, с готовым шаблоном. А значения пихать только по индексу. Но это оверхед и ничем не лучше предыдущего варианта.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942602
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
авторДа, тут простор для оптимизиации нереальный.

Нет. Простор для оптимизации всегда реальный.

Да, оптимизация может закончиться заменой алгоритма.
Но обычно она начинается с профилировки существующего кода и оценки суммарных долей времени.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942628
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyавторДа, тут простор для оптимизиации нереальный.
Нет. Простор для оптимизации всегда реальный.

Русский язык стоит подтянуть. "Нереальный" в данном случае "невероятно огромный", "необъятный".

boobyДа, оптимизация может закончиться заменой алгоритма.

Небо синее, вода мокрая.

boobyНо обычно она начинается с профилировки существующего кода и оценки суммарных долей времени.
Профилировка обычно заканчивается тем что суммарные доли времени равномерно размазаны по всему коду.
Вы ещё вот этим ребятам расскажите. С 4й минуты про профилировку.
YouTube Video
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942639
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяавторНет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире.
из базы приходит N записей в ResultSet
из них нужно сформировать строку содержащую html код таблицы с заполненной данными из ResultSet
когда данных мало - летает.
но есть наборы дофига строк....
это, конечно не правильно, и я против того чтоб на клиента гнать стока записей, но это тот случай, когда это как-бы ну....
можно и на клиенте сфомировать саму таблицу, но сервер быстрее...
тут конечно и на передачу по сети (правда локальной) время идет...
вот така проблемка
Вадя. В твоём коде блокером (скорее всего) будет ожидание записи в сокет в тот момент когда ты
наколдовал свою гигабайтную html-ку и отдаёшь ее клиенту. И здесь попытка оптимизировать StringBuilder
выглядит наивной и эпичной. Работай напрямую с *Response.write(..) и получишь нужную золотую середину
между асинхронностью и скоростью разработки.

StringBuilder - это просто удобный фасад к char[] и больше там ничего наковырять нельзя.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942642
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВопрос ребром: зачем формировать ответ целиком в памяти, почему не отдавать на клиент частями?
автор1. Нафига тут String/StringBuilder вообще? Гнать потоком все данные через Writer или даже OutputStream прямо в отклик.
этот вариант тоже рассматривается, но под него на клиенте надо переделывать..
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942645
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

авторРусский язык стоит подтянуть
Подтягивайте, желательно с усердием.

"невероятно огромный", "необъятный" в русском языке не синонимы для "все равно, с чего начать оптимизацию"

авторПрофилировка обычно заканчивается тем что суммарные доли времени равномерно размазаны по всему коду.
10/10 - у Вади это не так , при правильном сложении циферок.

Он же именно русским языком, а не каким-нибудь другим сообщил:
авториз базы приходит N записей в ResultSet
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942646
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяэтот вариант тоже рассматривается, но под него на клиенте надо переделывать..
Клиент-то тут при чем? Ему всё равно как именно сервер отдаёт текст.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942649
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby"невероятно огромный", "необъятный" в русском языке не синонимы для "все равно, с чего начать оптимизацию"

Спасибо, КЭП.

[/quot]
авторПрофилировка обычно заканчивается тем что суммарные доли времени равномерно размазаны по всему коду.
10/10 - у Вади это не так , при правильном сложении циферок.

Он же именно русским языком, а не каким-нибудь другим сообщил:
авториз базы приходит N записей в ResultSet[/quot]
[/quot]
Очевидно что ни одного сервера работающего с БД вы не профилировали. Удачи.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942653
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD...Это если каждый раз добавлять строку, которая длиннее sb в 2 раза+2. int newCapacity = (value.length + 1) * 2;
Опппс.... Беру свои слова обратно. Слона и не заметил. Ну тогда у них все хорошо.
...
Рейтинг: 0 / 0
Ускорение StringBuilder
    #38942658
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczвадяэтот вариант тоже рассматривается, но под него на клиенте надо переделывать..
Клиент-то тут при чем? Ему всё равно как именно сервер отдаёт текст.
ну если по частям - то надо как-то эти части обрабатывать.

меня в данном случае интересует оптимизация StringBuilder потому, что может я чего по нему не знаю.
а так - надо в комплексе смотреть - на весь путь .
эта часть по java поэтому тут и интересуюсь
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Ускорение StringBuilder
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]