powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Про String в циклах
25 сообщений из 27, страница 1 из 2
Про String в циклах
    #38240898
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как правильнее делать
есть цикл, в нем используется стринговская переменная.
ей что-то присваивется каждый раз новое, изменянтя и пр.
что лучше - эту переменную описать перед циклом?
или в цикле описывать, перед первым использованием?
или вместо стринг использовать что-то другое? (StringBuffer, StringBuilder) описыват перед циклом и очищать в цикле, или в описывать цикле
если цикл идет 1-5 , наверно всё одинаково, тогда с какого количества есть смысл что-то городить?
...
Рейтинг: 0 / 0
Про String в циклах
    #38240910
h869311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StringBuffer
...
Рейтинг: 0 / 0
Про String в циклах
    #38240925
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
h869311StringBuffer

это частичный ответ
где лучше описывать?
и чем это лучше, ведь надо очищать, перед использованием..
...
Рейтинг: 0 / 0
Про String в циклах
    #38241041
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если дело о производительности, то лучше StringBuilder, описать его перед началом цикла, и там же, в начале, выделить достаточно памяти. Дальше в цикле только очищать. В любом случае, очищение будет происходить быстрее создания новой строки в каждом цикле. Это всего лишь изменение поля с длиной строки
...
Рейтинг: 0 / 0
Про String в циклах
    #38241050
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringBuilder либо StringBuffer.
Код: java
1.
2.
3.
4.
StringBuilder sb = new StringBuilder()
for(Object o : collection){
  sb.append(o);
}


Переиспользовать и очищать особого смысла нет.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241064
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ей что-то присваивется каждый раз новое, изменянтя и пр.Нужен код.

вадячто лучше - эту переменную описать перед циклом?
или в цикле описывать, перед первым использованием?Без разницы.

описыват перед циклом и очищать в цикле, или в описывать циклеТрудно сказать, скорее всего абсолютно одинаково. Бенчмарки специально не гнял.
с какого количества есть смысл что-то городить?Имхо, если меньше 3х конкотинаций, смысла совсем нет. Аналогично.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241082
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем случае, переиспользование объектов ведёт к худшей производительности чем пересоздание.
Пересозданый ненужный объект быстро умирает в Eden, а когда допилят Escape Analysis, то будет умирать ещё раньше.
Переиспользуемый объект оседает в Tenured. Количество живых объектов в Tenured - основная проблема Java GC. Т.е. при каждой сборке этот объект будет проверятся.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241110
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пятница?
А впрочем, в условиях топика 1-5 циклов, тут все сойдет, разве что StringBuffer явно лишнее
...
Рейтинг: 0 / 0
Про String в циклах
    #38241113
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Залез в исходник AbstractStringBuilder, ivanra абсолютно прав - лучше чистить и повторно использовать.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241117
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraразве что StringBuffer явно лишнее
В Java 7 - пофиг.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241119
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkЗалез в исходник AbstractStringBuilder, ivanra абсолютно прав - лучше чистить и повторно использовать.
Извольте объяснится.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241138
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
package java.lang;

import java.util.Arrays;

abstract class AbstractStringBuilder implements Appendable, CharSequence {

    char[] value;
    int count;

    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

    public void setLength(int newLength) {
        if (newLength < 0) {
            throw new StringIndexOutOfBoundsException(newLength);
        }
        ensureCapacityInternal(newLength);

        if (count < newLength) {
            for (; count < newLength; count++) {
                value[count] = '\0';
            }
        } else {
            count = newLength;
        }
    }

    public AbstractStringBuilder append(String str) {
        if (str == null) {
            str = "null";
        }
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }

    void expandCapacity(int minimumCapacity) {
        int newCapacity = value.length * 2 + 2;
        if (newCapacity - minimumCapacity < 0) {
            newCapacity = minimumCapacity;
        }
        if (newCapacity < 0) {
            if (minimumCapacity < 0) // overflow
            {
                throw new OutOfMemoryError();
            }
            newCapacity = Integer.MAX_VALUE;
        }
        value = Arrays.copyOf(value, newCapacity);
    }

    private void ensureCapacityInternal(int minimumCapacity) {
        if (minimumCapacity - value.length > 0) {
            expandCapacity(minimumCapacity);
        }
    }
}


...
Рейтинг: 0 / 0
Про String в циклах
    #38241144
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczivanraразве что StringBuffer явно лишнееВ Java 7 - пофиг.
не первый раз встречаю что в 7 synchronized должно работать быстрее. Но каким образом? Операционка остается та же и процессор тот же. Отказались от системного вызова и реализовали свой? Есть ссылка на официальное сообщение?
...
Рейтинг: 0 / 0
Про String в циклах
    #38241146
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraне первый раз встречаю что в 7 synchronized должно работать быстрее. Но каким образом?
Может догадается, что проверки не нужны и выбросит их.. потом)
...
Рейтинг: 0 / 0
Про String в циклах
    #38241159
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraне первый раз встречаю что в 7 synchronized должно работать быстрее.
Наверное потому что я в каждой второй теме про StringBuffer про это пишу.

ivanraНо каким образом? Операционка остается та же и процессор тот же. Отказались от системного вызова и реализовали свой? Есть ссылка на официальное сообщение?
JVM ассоциирует монитор с первым потоком, который его захватил. Все последующие обращения этого потока к монитору не приводят ни к какой синхронизации вообще. Просто идёт проверка "а это ты - проходи". Это вообще ничего не стоит.
А вот если вдруг другой поток подкрадется к монитору, то JVM "насторожится" и начнет использовано полноценный synchronized уже для всех потоков.
Поэтому StringBuffer вида сделал и выкинул, от StringBuilder уже почти ни чем не отличается. Конечно, какая-то минимальная, разница есть. Но она на столько мала, что на фоне вызовов методов, и других операций со StringBuilder, она не заметна.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241160
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkпорезаный java.lang.AbstractStringBuilder
Смотреть в исходники я и сам умею. Ткните пальцем почему очищение быстрее пересоздания? Имеется ввиду что что уже будет готов массив заданого размера? Так это изначальным capacity решается.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241184
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Во-первых, String никогда не изменяется, изменяется только ссылка.
Во-вторых, пофигу, что так, что эдак.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241185
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczИмеется ввиду что что уже будет готов массив заданого размера? Так это изначальным capacity решается.
Потому что создание и инициализация массива тоже чего-то стоит. (и времени и памяти).
При вызове sb.setLength(0); этого не происходит, только лишь значение поля count становится равным 0.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241196
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВ общем случае, переиспользование объектов ведёт к худшей производительности чем пересоздание.
Пересозданый ненужный объект быстро умирает в Eden, а когда допилят Escape Analysis, то будет умирать ещё раньше.
Переиспользуемый объект оседает в Tenured. Количество живых объектов в Tenured - основная проблема Java GC. Т.е. при каждой сборке этот объект будет проверятся.
Очень интересное утверждение.

Т.е. если создавать объекты в цикле, занимая все новую и новую память, а сборщик мусора ее будет параллельно очищать, предварительно еще проверив, что на объект нет ссылок.
Это будет быстрее, чем писать в одну и ту же область памяти, когда сборка мусора ВООБЩЕ НЕ ТРЕБУЕТСЯ до окончания цикла?
...
Рейтинг: 0 / 0
Про String в циклах
    #38241199
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkПотому что создание и инициализация массива тоже чего-то стоит. (и времени и памяти).
При вызове sb.setLength(0); этого не происходит, только лишь значение поля count становится равным 0.
Эта экономия нивелирутся затратами GC на долгоживущий объект.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241218
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
И еще, не подскажете, почему на Android, где как раз очень важна производительность,
рекомендуют как раз переиспользовать объекты, а не пересоздавать?

allocating memory is always more expensive than not allocating memory
...
Рейтинг: 0 / 0
Про String в циклах
    #38241224
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЭта экономия нивелирутся затратами GC на долгоживущий объект.
Правильно ли я понял, что GC проще удалить 100 (1000, 1 000 000, сколько???) короткоживущих объектов,
чем 1 долгоживущий?

Мы же не сравниваем 1 короткоживущий и 1 долгоживущий.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241234
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTIDИ еще, не подскажете, почему на Android, где как раз очень важна производительность,
рекомендуют как раз переиспользовать объекты, а не пересоздавать?
allocating memory is always more expensive than not allocating memory
Потому что там иначе работает GC. Потому что там программы остро нуждаются в экономии памяти. Т.е. расход памяти там, в итоге, бъет по перфомансу сильнее.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241239
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HoBTIDBlazkowicz,
И еще, не подскажете, почему на Android, где как раз очень важна производительность,
рекомендуют как раз переиспользовать объекты, а не пересоздавать?

allocating memory is always more expensive than not allocating memory
Ну на Android всё-таки другая VM.
...
Рейтинг: 0 / 0
Про String в циклах
    #38241246
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTIDчем писать в одну и ту же область памяти, когда сборка мусора ВООБЩЕ НЕ ТРЕБУЕТСЯ до окончания цикла?
IMHO.
Сборка мусора может потребоваться вне зависимости от цикла (и не один раз).
Алгоритм сборки для коротко живущих объектов как раз заточен на то, чтобы не рассматривать не нужные объекты - грубо говоря он пробигает только по нужным и копирует их либо в новое место для коротко живущих либо в место для долго живущих.
Если объект переиспользуется это приведет к тому, что в первом случае произойдет примерно один и тот же набор действий (что и создастся новый), а во втором он перелетит в долгоживущий, gc которого потяжеловесней. Если же буфер потом будет использоваться всегда это не страшно. А если высвободится, то вызовет деградацию производительности.

Если gc не вызовется в случае перезаписи и вызовется при ее осутствии, то перезапись быстрее.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Про String в циклах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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