|
|
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Сейчас делаю парсер и ради интереса попробовал сделать простенькую реализацию своего StringBuilder'а, конечно это очень уж черновой вариант, но тем не менее на Core2Duo, Linux, JDK8 получаю в 2-5 быстрее. Понятно, что в моём классе нет расширения буфера, но и для StringBuilder сразу задан нормальный буфер, который нет обходимости расширять. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 21:02 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
FororСейчас делаю парсер и ради интереса попробовал сделать простенькую реализацию своего StringBuilder'а, конечно это очень уж черновой вариант, но тем не менее на Core2Duo, Linux, JDK8 получаю в 2-5 быстрее. Чем мерил скорость? Правильными средствами , или лаптём по карте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 08:07 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Foror, У StrBuilder.append(char c, int i) есть аналог StringBuilder.setChatAt(i,c) а не append(c), который будет работать не медленнее вашего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 09:07 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, просто запустил программу, как обычные пользователи запускают в системе. К тому же там приличный цикл для прогрева, так что не вижу смысла какие-то доп. средства использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 09:32 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
FororК тому же там приличный цикл для прогрева Где он? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 09:35 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
0FD, да, действительно работает также, а иногда даже в 2 раза быстрее, это может быть из-за того, что после выделения буфер забивается \0? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 09:41 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, "for (int k = 0; k < count; k++)" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 09:42 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
FororBlazkowicz, "for (int k = 0; k < count; k++)" В этом цикле уже замеры идут. А прогрев-то где? А ничего что на клиентской JVM по-умолчанию для активации JIT нужно выполнить 10К итераций? А тут что считается? Среднее между интерпретацией, и работой скомпилированого кода? Включая время затраченое на саму компиляцию? Почитайте любую статью по ключевым словам Java micro-benchmarking ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 09:48 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, понятно, сделал следующее: Код: java 1. 2. 3. 4. 5. 6. В этот раз StringBuilder#append(char) медленнее в 7 раз, чем StrBuilder#append(int,char) и в 20 раз медленнее, чем StringBuilder#append(int, char). Мне нужно будет отдавать контент юзерам, генерируя html через StringBuilder и то, что #append(int, char) работает в 20 раз быстрее, довольно интересное открытие :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 10:14 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Foror, Не проще ли просто открыть код StringBuilder/AbstractStringBuilder и посмотреть методы? Там, например везде имеются проверки на границы или на размер буфера. Очевидно, что если их выкинуть, будет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 10:18 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, это понятно, просто хотелось понять сколько я теряю в производительности, если 2-3 раза, то ладно, но когда в 20 раз быстрее, то гораздо интереснее. Не ожил, что могут быть такие результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 10:21 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczОчевидно, что если их выкинуть, будет быстрее. Не факт. Ряд реализаций JVM, проверки на попадание в array например не делает, если такая проверка уже была Выше по коду. Мне особо нравится комментарий: ...увиличивает скорость в 2.5 раза, видимо из-за какого-то предсказания Когда я пытался на таких тривиальных операциях мерить, у меня тоже получалось +/- лапоть. Т.к. введение пустого и тривиального кода или перестановка 2-3 строк местами могло сказаться на скорости от 2-3 до 10 раз. Большая проблема производительности современных процов - предсказание перехода и промахи. К сожалению, в Java, как ни оптимизируй. данные критерии НИКАК не изменишь. Я с учетом JIT компиляции и возможности JIT компилятора на лету перестраивать код (по статистике) - то, что можно намерить в тесте, может очень сильно отличаться от того, что будет в проде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 17:58 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Обычно если можно прогнать на реальных данных, или на данных близких к реальным - я такую прогонку делаю. И обычно, если на тестовых данных есть выигрыш, то он есть и на реальных. Ествественно, такой прогон не должен быть микробенчмаркингом. Например, извлечение из базы и обработка особым образом 1млн записей. Прогнали тест - занимает 8сек, подсунул коннектор от mariadb вместо мускуловского - обработка тех же данных 20сек. Я таким тестам обычно доверяю, т.к. на больших обьемах там должно было уже все скомпилиться. А если оно не скомпилилось - то и в продакшене оно не скомпилится. а ловить время одной команды - это конечно маразм... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 18:07 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Я не сторонник преждевременной оптимизации, но считаю есть проекты, где нужно изначально обдумывать узкие горлышки. В моём случае это веб-фреймворк, в котором 50% нагрузки это работа с текстом. А потому нужны шустрые методы. Даже с этим тестом, мне в итоге пришлось намного дольше ждать (разница в перформансе 20x!), пока выполнится медленный метод. Соответственно в реальной ситуации, при нагрузке будет нужен не один, а 20 серверов. А это существенная разница. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 19:21 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
Какой-то странный фрейм-ворк. Скорее, проблемой должна быть передача текста "туда-сюда-обратно" между компонентами. Боюсь, скорость работы StringBuilder'а там будет на одном из предпоследних мест. Значительно менее важна, чем даже просто выделения/очистки памяти под объекты String +получение-отдача запроса по сети +бизнес обработка. Что бы бутылочным горлышком был именно StringBuilder, мне такого даже не представить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 20:16 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
FororЯ не сторонник преждевременной оптимизации, но считаю есть проекты, где нужно изначально обдумывать узкие горлышки. В моём случае это веб-фреймворк, в котором 50% нагрузки это работа с текстом. А потому нужны шустрые методы. Даже с этим тестом, мне в итоге пришлось намного дольше ждать (разница в перформансе 20x!), пока выполнится медленный метод. Соответственно в реальной ситуации, при нагрузке будет нужен не один, а 20 серверов. А это существенная разница. А зачем вам StringBuilder внутри Web Framework? Откажитесь от String полностью. CharSequence + Reader\Writer дадут бОльшую производительность чем множественные преобразования в String ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 20:22 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
FororBlazkowicz, это понятно, просто хотелось понять сколько я теряю в производительности, если 2-3 раза, то ладно, но когда в 20 раз быстрее, то гораздо интереснее. Не ожил, что могут быть такие результаты. 1. Таки замеры производительности в мелких кусках кода- очень сложная штука в java. послушайте лекции автора библиотеки, на которую я давал ссылку- Алексея Шипилёва. Он на понятном русском языка на эту (да и другие) тему говорит. Вы просто не понимаете всей сложности проблемы. 2. Пока это не узкое место-не партесь на тему скорости сбора строки. Если будет узким местом- перепишете хоть на заполнение массива вручную. Но правду говорят- серверный компилятор может очень сильно изменить реальную скорость кода. Т.е. всё же прислушайтесь к п.1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 21:49 |
|
||
|
Можно ускорить StringBuilder?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА зачем вам StringBuilder внутри Web Framework? Откажитесь от String полностью. CharSequence + Reader\Writer дадут бОльшую производительность чем множественные преобразования в String Им собирается конечная страница из дерева компонетов. Парсер из char'ов делает String'и, поэтому в итоге SB будет собирать именно String'и. И тут пока не заморачиваюсь, что будет быстрее String'и или char[]. CharSequence это просто интерфейс, если не ошибаюсь к нему даже String можно привести. А вот, то, что отдавать сразу на Writer, я как-то не подумал :) Думаю потом оно конечно всплыло бы, рука-лицо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 09:51 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38705368&tid=2126847]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
166ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 456ms |

| 0 / 0 |
