Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Про String в циклах / 25 сообщений из 27, страница 1 из 2
26.04.2013, 08:17:49
    #38240898
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
как правильнее делать
есть цикл, в нем используется стринговская переменная.
ей что-то присваивется каждый раз новое, изменянтя и пр.
что лучше - эту переменную описать перед циклом?
или в цикле описывать, перед первым использованием?
или вместо стринг использовать что-то другое? (StringBuffer, StringBuilder) описыват перед циклом и очищать в цикле, или в описывать цикле
если цикл идет 1-5 , наверно всё одинаково, тогда с какого количества есть смысл что-то городить?
...
Рейтинг: 0 / 0
26.04.2013, 08:34:43
    #38240910
h869311
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
StringBuffer
...
Рейтинг: 0 / 0
26.04.2013, 08:53:14
    #38240925
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
h869311StringBuffer

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


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

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

описыват перед циклом и очищать в цикле, или в описывать циклеТрудно сказать, скорее всего абсолютно одинаково. Бенчмарки специально не гнял.
с какого количества есть смысл что-то городить?Имхо, если меньше 3х конкотинаций, смысла совсем нет. Аналогично.
...
Рейтинг: 0 / 0
26.04.2013, 10:33:26
    #38241082
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
В общем случае, переиспользование объектов ведёт к худшей производительности чем пересоздание.
Пересозданый ненужный объект быстро умирает в Eden, а когда допилят Escape Analysis, то будет умирать ещё раньше.
Переиспользуемый объект оседает в Tenured. Количество живых объектов в Tenured - основная проблема Java GC. Т.е. при каждой сборке этот объект будет проверятся.
...
Рейтинг: 0 / 0
26.04.2013, 10:48:28
    #38241110
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
Пятница?
А впрочем, в условиях топика 1-5 циклов, тут все сойдет, разве что StringBuffer явно лишнее
...
Рейтинг: 0 / 0
26.04.2013, 10:52:07
    #38241113
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
Залез в исходник AbstractStringBuilder, ivanra абсолютно прав - лучше чистить и повторно использовать.
...
Рейтинг: 0 / 0
26.04.2013, 10:54:54
    #38241117
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
ivanraразве что StringBuffer явно лишнее
В Java 7 - пофиг.
...
Рейтинг: 0 / 0
26.04.2013, 10:55:28
    #38241119
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
avp.mkЗалез в исходник AbstractStringBuilder, ivanra абсолютно прав - лучше чистить и повторно использовать.
Извольте объяснится.
...
Рейтинг: 0 / 0
26.04.2013, 11:12:05
    #38241138
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
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
26.04.2013, 11:14:52
    #38241144
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
Blazkowiczivanraразве что StringBuffer явно лишнееВ Java 7 - пофиг.
не первый раз встречаю что в 7 synchronized должно работать быстрее. Но каким образом? Операционка остается та же и процессор тот же. Отказались от системного вызова и реализовали свой? Есть ссылка на официальное сообщение?
...
Рейтинг: 0 / 0
26.04.2013, 11:18:39
    #38241146
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
ivanraне первый раз встречаю что в 7 synchronized должно работать быстрее. Но каким образом?
Может догадается, что проверки не нужны и выбросит их.. потом)
...
Рейтинг: 0 / 0
26.04.2013, 11:26:35
    #38241159
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про String в циклах
ivanraне первый раз встречаю что в 7 synchronized должно работать быстрее.
Наверное потому что я в каждой второй теме про StringBuffer про это пишу.

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

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

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

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

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

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

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


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