|
|
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
есть StringBuilder sf = new StringBuilder(250000); в цикле он заполняется примерно так sf.append("лялялялялялялял).append(String) .append(int) .append("d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh") и т.д. длина sf может быть различна максимальная длина заполняется 50мс можно как-либо ускорить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 08:20 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадя, Никак, AFAIK chain append наиболее эффективный в данном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 08:58 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадя, Можно поэкспериментировать с char[]. Но выгода будет далеко не всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 09:02 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
если тут .append("d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh") "d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh" заменить на константу finaly , будет какой-то смысл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 09:47 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадяесли тут .append("d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh") "d gdfgs fhs fghjsfgj fgjg hsdfh swfhwgfjhfjdfgjd ghjdgh" заменить на константу finaly , будет какой-то смысл? Нет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире. Почему именно это место вызывает проблему? Какая задача решается? Заполнение шаблона или что-то ещё? Почему её нужно оптимизировать, а не, например, распараллелить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 09:54 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадяесть 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 который сможет их так-же быстро заглатывать? Сможет-ли вообще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 11:09 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
авторНет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире. из базы приходит N записей в ResultSet из них нужно сформировать строку содержащую html код таблицы с заполненной данными из ResultSet когда данных мало - летает. но есть наборы дофига строк.... это, конечно не правильно, и я против того чтоб на клиента гнать стока записей, но это тот случай, когда это как-бы ну.... можно и на клиенте сфомировать саму таблицу, но сервер быстрее... тут конечно и на передачу по сети (правда локальной) время идет... вот така проблемка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 13:11 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадя, и вы уверены, что дело именно в StringBuilder? Крайне сомнительно. Как замеряли? Менять statement.setFetchSize(int rows) пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 13:29 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадя.... из базы приходит N записей в ResultSet Сомневаюсь, что в данном случае будет тормозить StringBuilder. Сейчас посмотрел на исходники на grepcode.com , выделение памяти достаточно не эффективно. Всегда ровно под размер добавляемой строки увеличивает. Можно, в принципе: 1. Сделать свою процедуру (типа fastAppend) и оптимизировать выделение памяти (заранее перед вызовом append добавлять память большими кусками через ensureCapacity). 2. Периодически, например перед обработкой каждой строки докидывать в StringBuilder достаточно большой объем памяти. В общем, если grepcode.com не врет, вырвать руки и ноги тем, кто StringBuilder писал. И переставить местами. Что у них руки сразу торчали из того места, откуда следует (т.е. из пятой точки). To All: а почему авторы JRE любят классы делать final? Нафига? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 13:45 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
p.s. Первую строчку в пред. сообщение удалить. Вроде, судя по исходникам, StringBuilder сделан через одно место ((( Действительно ДОЛЖЕН тормозить и не по детски. Тесты не писал и не проверял, пускай этим автор топика заморачивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 13:47 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадя, авториз базы приходит N записей в ResultSet .... когда данных мало - летает. но есть наборы дофига строк.... ... вот така проблемка Вадя, на твой вопрос есть два варианте ответа - плохой и матерный. Дам плохой ответ. Оставь в покое, по возможности навсегда , StringBuilder. Уточнение - ни в коем случае не оставляй в покое и обязательно усовершенствуй StringBuilder (например, по советам Leonid Kudryavtsev ), если другого занятия ты для себя придумать не можешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 14:00 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 14:01 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev Сейчас посмотрел на исходники на grepcode.com , выделение памяти достаточно не эффективно. Всегда ровно под размер добавляемой строки увеличивает. Это если каждый раз добавлять строку, которая длиннее sb в 2 раза+2. int newCapacity = (value.length + 1) * 2; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 14:07 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадя, автороптимизирую по кускам. ты не по тем кускам оптимизируешь. у тебя нет права ждать результата от оптимизации куска, выбранного путем тыканья пальца в позапрошлогодний снег. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 14:12 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадяавторНет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире. из базы приходит N записей в ResultSet из них нужно сформировать строку содержащую html код таблицы с заполненной данными из ResultSet Вопрос ребром: зачем формировать ответ целиком в памяти, почему не отдавать на клиент частями? Типа такого: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 14:14 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадяавторНет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире. из базы приходит N записей в ResultSet из них нужно сформировать строку содержащую html код таблицы с заполненной данными из ResultSet когда данных мало - летает. но есть наборы дофига строк.... это, конечно не правильно, и я против того чтоб на клиента гнать стока записей, но это тот случай, когда это как-бы ну.... можно и на клиенте сфомировать саму таблицу, но сервер быстрее... тут конечно и на передачу по сети (правда локальной) время идет... вот така проблемка Да, тут простор для оптимизиации нереальный. 1. Нафига тут String/StringBuilder вообще? Гнать потоком все данные через Writer или даже OutputStream прямо в отклик. 2. Можно, конечно, завести огромный массив, забитый пробелами, с готовым шаблоном. А значения пихать только по индексу. Но это оверхед и ничем не лучше предыдущего варианта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 14:35 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, авторДа, тут простор для оптимизиации нереальный. Нет. Простор для оптимизации всегда реальный. Да, оптимизация может закончиться заменой алгоритма. Но обычно она начинается с профилировки существующего кода и оценки суммарных долей времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 14:41 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
boobyавторДа, тут простор для оптимизиации нереальный. Нет. Простор для оптимизации всегда реальный. Русский язык стоит подтянуть. "Нереальный" в данном случае "невероятно огромный", "необъятный". boobyДа, оптимизация может закончиться заменой алгоритма. Небо синее, вода мокрая. boobyНо обычно она начинается с профилировки существующего кода и оценки суммарных долей времени. Профилировка обычно заканчивается тем что суммарные доли времени равномерно размазаны по всему коду. Вы ещё вот этим ребятам расскажите. С 4й минуты про профилировку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 14:55 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадяавторНет. Вообще ИМХО, вы не с того боку к решению проблемы подошли. Опишите картину шире. из базы приходит N записей в ResultSet из них нужно сформировать строку содержащую html код таблицы с заполненной данными из ResultSet когда данных мало - летает. но есть наборы дофига строк.... это, конечно не правильно, и я против того чтоб на клиента гнать стока записей, но это тот случай, когда это как-бы ну.... можно и на клиенте сфомировать саму таблицу, но сервер быстрее... тут конечно и на передачу по сети (правда локальной) время идет... вот така проблемка Вадя. В твоём коде блокером (скорее всего) будет ожидание записи в сокет в тот момент когда ты наколдовал свою гигабайтную html-ку и отдаёшь ее клиенту. И здесь попытка оптимизировать StringBuilder выглядит наивной и эпичной. Работай напрямую с *Response.write(..) и получишь нужную золотую середину между асинхронностью и скоростью разработки. StringBuilder - это просто удобный фасад к char[] и больше там ничего наковырять нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 15:04 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
авторВопрос ребром: зачем формировать ответ целиком в памяти, почему не отдавать на клиент частями? автор1. Нафига тут String/StringBuilder вообще? Гнать потоком все данные через Writer или даже OutputStream прямо в отклик. этот вариант тоже рассматривается, но под него на клиенте надо переделывать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 15:05 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, авторРусский язык стоит подтянуть Подтягивайте, желательно с усердием. "невероятно огромный", "необъятный" в русском языке не синонимы для "все равно, с чего начать оптимизацию" авторПрофилировка обычно заканчивается тем что суммарные доли времени равномерно размазаны по всему коду. 10/10 - у Вади это не так , при правильном сложении циферок. Он же именно русским языком, а не каким-нибудь другим сообщил: авториз базы приходит N записей в ResultSet ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 15:06 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
вадяэтот вариант тоже рассматривается, но под него на клиенте надо переделывать.. Клиент-то тут при чем? Ему всё равно как именно сервер отдаёт текст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 15:07 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
booby"невероятно огромный", "необъятный" в русском языке не синонимы для "все равно, с чего начать оптимизацию" Спасибо, КЭП. [/quot] авторПрофилировка обычно заканчивается тем что суммарные доли времени равномерно размазаны по всему коду. 10/10 - у Вади это не так , при правильном сложении циферок. Он же именно русским языком, а не каким-нибудь другим сообщил: авториз базы приходит N записей в ResultSet[/quot] [/quot] Очевидно что ни одного сервера работающего с БД вы не профилировали. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 15:09 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
0FD...Это если каждый раз добавлять строку, которая длиннее sb в 2 раза+2. int newCapacity = (value.length + 1) * 2; Опппс.... Беру свои слова обратно. Слона и не заметил. Ну тогда у них все хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 15:12 |
|
||
|
Ускорение StringBuilder
|
|||
|---|---|---|---|
|
#18+
Blazkowiczвадяэтот вариант тоже рассматривается, но под него на клиенте надо переделывать.. Клиент-то тут при чем? Ему всё равно как именно сервер отдаёт текст. ну если по частям - то надо как-то эти части обрабатывать. меня в данном случае интересует оптимизация StringBuilder потому, что может я чего по нему не знаю. а так - надо в комплексе смотреть - на весь путь . эта часть по java поэтому тут и интересуюсь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2015, 15:14 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38942552&tid=2125503]: |
0ms |
get settings: |
5ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
91ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 538ms |

| 0 / 0 |
