|
|
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
как правильнее делать есть цикл, в нем используется стринговская переменная. ей что-то присваивется каждый раз новое, изменянтя и пр. что лучше - эту переменную описать перед циклом? или в цикле описывать, перед первым использованием? или вместо стринг использовать что-то другое? (StringBuffer, StringBuilder) описыват перед циклом и очищать в цикле, или в описывать цикле если цикл идет 1-5 , наверно всё одинаково, тогда с какого количества есть смысл что-то городить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 08:17:49 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
StringBuffer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 08:34:43 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
h869311StringBuffer это частичный ответ где лучше описывать? и чем это лучше, ведь надо очищать, перед использованием.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 08:53:14 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
Если дело о производительности, то лучше StringBuilder, описать его перед началом цикла, и там же, в начале, выделить достаточно памяти. Дальше в цикле только очищать. В любом случае, очищение будет происходить быстрее создания новой строки в каждом цикле. Это всего лишь изменение поля с длиной строки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 10:10:52 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
StringBuilder либо StringBuffer. Код: java 1. 2. 3. 4. Переиспользовать и очищать особого смысла нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 10:15:28 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
ей что-то присваивется каждый раз новое, изменянтя и пр.Нужен код. вадячто лучше - эту переменную описать перед циклом? или в цикле описывать, перед первым использованием?Без разницы. описыват перед циклом и очищать в цикле, или в описывать циклеТрудно сказать, скорее всего абсолютно одинаково. Бенчмарки специально не гнял. с какого количества есть смысл что-то городить?Имхо, если меньше 3х конкотинаций, смысла совсем нет. Аналогично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 10:22:39 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
В общем случае, переиспользование объектов ведёт к худшей производительности чем пересоздание. Пересозданый ненужный объект быстро умирает в Eden, а когда допилят Escape Analysis, то будет умирать ещё раньше. Переиспользуемый объект оседает в Tenured. Количество живых объектов в Tenured - основная проблема Java GC. Т.е. при каждой сборке этот объект будет проверятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 10:33:26 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
Пятница? А впрочем, в условиях топика 1-5 циклов, тут все сойдет, разве что StringBuffer явно лишнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 10:48:28 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
Залез в исходник AbstractStringBuilder, ivanra абсолютно прав - лучше чистить и повторно использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 10:52:07 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
ivanraразве что StringBuffer явно лишнее В Java 7 - пофиг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 10:54:54 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
avp.mkЗалез в исходник AbstractStringBuilder, ivanra абсолютно прав - лучше чистить и повторно использовать. Извольте объяснится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 10:55:28 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИзвольте объяснится. порезаный java.lang.AbstractStringBuilder Код: 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. 57. 58. 59. 60. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:12:05 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
Blazkowiczivanraразве что StringBuffer явно лишнееВ Java 7 - пофиг. не первый раз встречаю что в 7 synchronized должно работать быстрее. Но каким образом? Операционка остается та же и процессор тот же. Отказались от системного вызова и реализовали свой? Есть ссылка на официальное сообщение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:14:52 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
ivanraне первый раз встречаю что в 7 synchronized должно работать быстрее. Но каким образом? Может догадается, что проверки не нужны и выбросит их.. потом) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:18:39 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
ivanraне первый раз встречаю что в 7 synchronized должно работать быстрее. Наверное потому что я в каждой второй теме про StringBuffer про это пишу. ivanraНо каким образом? Операционка остается та же и процессор тот же. Отказались от системного вызова и реализовали свой? Есть ссылка на официальное сообщение? JVM ассоциирует монитор с первым потоком, который его захватил. Все последующие обращения этого потока к монитору не приводят ни к какой синхронизации вообще. Просто идёт проверка "а это ты - проходи". Это вообще ничего не стоит. А вот если вдруг другой поток подкрадется к монитору, то JVM "насторожится" и начнет использовано полноценный synchronized уже для всех потоков. Поэтому StringBuffer вида сделал и выкинул, от StringBuilder уже почти ни чем не отличается. Конечно, какая-то минимальная, разница есть. Но она на столько мала, что на фоне вызовов методов, и других операций со StringBuilder, она не заметна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:26:35 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
avp.mkпорезаный java.lang.AbstractStringBuilder Смотреть в исходники я и сам умею. Ткните пальцем почему очищение быстрее пересоздания? Имеется ввиду что что уже будет готов массив заданого размера? Так это изначальным capacity решается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:28:12 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
вадя, Во-первых, String никогда не изменяется, изменяется только ссылка. Во-вторых, пофигу, что так, что эдак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:44:03 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИмеется ввиду что что уже будет готов массив заданого размера? Так это изначальным capacity решается. Потому что создание и инициализация массива тоже чего-то стоит. (и времени и памяти). При вызове sb.setLength(0); этого не происходит, только лишь значение поля count становится равным 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:44:26 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ общем случае, переиспользование объектов ведёт к худшей производительности чем пересоздание. Пересозданый ненужный объект быстро умирает в Eden, а когда допилят Escape Analysis, то будет умирать ещё раньше. Переиспользуемый объект оседает в Tenured. Количество живых объектов в Tenured - основная проблема Java GC. Т.е. при каждой сборке этот объект будет проверятся. Очень интересное утверждение. Т.е. если создавать объекты в цикле, занимая все новую и новую память, а сборщик мусора ее будет параллельно очищать, предварительно еще проверив, что на объект нет ссылок. Это будет быстрее, чем писать в одну и ту же область памяти, когда сборка мусора ВООБЩЕ НЕ ТРЕБУЕТСЯ до окончания цикла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:48:01 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
avp.mkПотому что создание и инициализация массива тоже чего-то стоит. (и времени и памяти). При вызове sb.setLength(0); этого не происходит, только лишь значение поля count становится равным 0. Эта экономия нивелирутся затратами GC на долгоживущий объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:50:33 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, И еще, не подскажете, почему на Android, где как раз очень важна производительность, рекомендуют как раз переиспользовать объекты, а не пересоздавать? allocating memory is always more expensive than not allocating memory ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 11:57:24 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЭта экономия нивелирутся затратами GC на долгоживущий объект. Правильно ли я понял, что GC проще удалить 100 (1000, 1 000 000, сколько???) короткоживущих объектов, чем 1 долгоживущий? Мы же не сравниваем 1 короткоживущий и 1 долгоживущий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 12:00:21 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
HoBTIDИ еще, не подскажете, почему на Android, где как раз очень важна производительность, рекомендуют как раз переиспользовать объекты, а не пересоздавать? allocating memory is always more expensive than not allocating memory Потому что там иначе работает GC. Потому что там программы остро нуждаются в экономии памяти. Т.е. расход памяти там, в итоге, бъет по перфомансу сильнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 12:02:26 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
HoBTIDBlazkowicz, И еще, не подскажете, почему на Android, где как раз очень важна производительность, рекомендуют как раз переиспользовать объекты, а не пересоздавать? allocating memory is always more expensive than not allocating memory Ну на Android всё-таки другая VM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 12:03:42 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
HoBTIDчем писать в одну и ту же область памяти, когда сборка мусора ВООБЩЕ НЕ ТРЕБУЕТСЯ до окончания цикла? IMHO. Сборка мусора может потребоваться вне зависимости от цикла (и не один раз). Алгоритм сборки для коротко живущих объектов как раз заточен на то, чтобы не рассматривать не нужные объекты - грубо говоря он пробигает только по нужным и копирует их либо в новое место для коротко живущих либо в место для долго живущих. Если объект переиспользуется это приведет к тому, что в первом случае произойдет примерно один и тот же набор действий (что и создастся новый), а во втором он перелетит в долгоживущий, gc которого потяжеловесней. Если же буфер потом будет использоваться всегда это не страшно. А если высвободится, то вызовет деградацию производительности. Если gc не вызовется в случае перезаписи и вызовется при ее осутствии, то перезапись быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 12:07:38 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
HoBTIDПравильно ли я понял, что GC проще удалить 100 (1000, 1 000 000, сколько???) короткоживущих объектов, чем 1 долгоживущий? Дело не в том что "проще". А в том как это всё вообще работает. Пересоздание - ОК. Потратили немного больше на allocation. Вышли за пределы блока. Если escape analysis отработал успешно (а его, вроде, с каждой версией Java всё лучше допиливают). Объект умер быстро своей смертью. Даже без escape analysis он быстро уберется из Eden. К вашему вопросу о количестве... - количество убираемых объектов влияет на производительность напорядки меньше чем количество найденых живых. GC сканирует именно живые объекты. Все которы мы создали и забыл, он просто не найдёт и удалит. Причем пачкой - что очень быстро. Теперь если объекты переиспользовать. Мы же не говорим про Hello World, который ничего не делает, кроме как использует один единственный StringBuilder. Мы же говорим о некой, потенциально большой, системе? Если вы решили переиспользовать объекты, значит вы это будете делать не в одном месте. А во многих. Ведь вы считаете что это быстрее, чем создавать новые. Поэтому придерживаетесь этого подхода. Таким образом ваш объект оседает в Eden, перемещается в survived и в конце-концов оседает в tenured. Ваш объект всегда нужен и всегда живой. Поэтому он сканируется при каждой сборке в Tenured. И влияет на производительность всей системы. Мой ответ не претендует на полноценность, так как стоит рассмотреть альтернативные алгоритмы сборки, такие как G1. Кроме этого, не исключено что в готовой системе можно и с массой объектов tenured свести работу к GC к минимум тонкими настройками. Но это всё индивидуально для каждого проекта. HoBTIDМы же не сравниваем 1 короткоживущий и 1 долгоживущий. Сравниваем, не понятно что, не понятно с чем. Я же говорю про общий случай. А вы всё пытаетесь свести к одному единственому, в котором переиспользование вдруг окажется быстрее. Конечно бывают варианты, когда переиспользование окажется выгоднее. Но это не значит что переиспользование выгодне во всех случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 12:14:28 |
|
||
|
Про String в циклах
|
|||
|---|---|---|---|
|
#18+
авторStringBuilder либо StringBuffer. Код: java 1. 2. 3. 4. Переиспользовать и очищать особого смысла нет. это для конкретнного случая а если надо вернуть стринг, то без очищения(удаления, обнуления длины и пр.) StringBuilder().toString вернет всю все данные если цикл из приличного числа шагов и без длительных ожидающих действий (обращений к базе и пр.) когда может включиться сборщик мусора. чисто простые преобразования, арифметика. тогда создание нового StringBuilder (с заданным размером) в цикле где будет размещаться в памяти? не вызоветли это пожирание памяти? ведь на запускается ж сборщик в цикле или?. как мне думается это авторЕсли дело о производительности, то лучше StringBuilder, описать его перед началом цикла, и там же, в начале, выделить достаточно памяти. Дальше в цикле только очищать. В любом случае, очищение будет происходить быстрее создания новой строки в каждом цикле. Это всего лишь изменение поля с длиной строки самое оптимальное. А для андроида даже очень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2013, 14:05:44 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2129464]: |
0ms |
get settings: |
17ms |
get forum list: |
26ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
62ms |
get topic data: |
19ms |
get forum data: |
5ms |
get page messages: |
93ms |
get tp. blocked users: |
2ms |
| others: | 306ms |
| total: | 544ms |

| 0 / 0 |
