powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что быстрее + или StringBuffer?
24 сообщений из 24, страница 1 из 1
Что быстрее + или StringBuffer?
    #34032383
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что должно быстрее отработать:
Код: plaintext
1.
2.
year =  2006 ;
String s = "сейчас "+year+" год" ;
или
Код: plaintext
1.
2.
3.
4.
    
StringBuilder buf =  new  StringBuilder();
buf.append("cейчас ").append(year).append(" год");
String s = buf.toString();
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032443
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А самому проверить?
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032464
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не заметишь разницу в таком тесте.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032470
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimmНе заметишь разницу в таком тесте.
В конкретно таком - естественно.
Лучше использовать более простой способ - с String.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032475
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итерация в 100000 циклов дает более интересный результат.
В принципе, ожидаемый.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032489
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так какой результат ожидаемый? Это теоретический вопрос, а не практический.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032635
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvТак какой результат ожидаемый? Это теоретический вопрос, а не практический.
теоретически это практический вопрос, поэтому х его з.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032643
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvТак какой результат ожидаемый? Это теоретический вопрос, а не практический.

Теоретический вопрос - это что отрабатывает быстрее:
s = s + "VALUE"; strbuf.append("VALUE"); на произвольном (большом) числе итераций.
Однозначно - append.
Причем понятно - почему.

В вашем примере я не вижу теоретического вопроса.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032656
Feech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот набросал тут примерчик:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 import  java.util.*;
 public   class  StringTest{
	 public   static   void  main(String[] args){
		 int  n = Integer.parseInt(args[ 0 ]);
		 int  year;
		 long  t1 = System.currentTimeMillis(), t2;
		 for ( int  i =  0 ; i < n; i++){
			year =  2006 ;
			String s = "Seichas "+year+" god";
		}
		t2 = System.currentTimeMillis();
		System.out.println("String Time: " + (t2-t1)/ 1000  + " sec.");

		t1 = System.currentTimeMillis();
		 for ( int  i =  0 ; i < n; i++){
			year =  2006 ;
			StringBuilder buf =  new  StringBuilder();
			buf.append("Seichas ").append(year).append(" god");
			String s = buf.toString();
		}
		t2 = System.currentTimeMillis();
		System.out.println("StringBuilder Time: " + (t2-t1)/ 1000  + " sec.");
	}
}

Показывает одно и то же время и расход памяти для обоих методов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
D:\Temp\java>java StringTest 10000000
String Time: 4 sec.
StringBuilder Time: 4 sec.

D:\Temp\java>java StringTest 100000000
String Time: 42 sec.
StringBuilder Time: 42 sec.

Если смотреть грубо на код, то метод с String делает в итоге следующее(операции присваивания опускаем):
1. создаст три строковых объекта в строковом буфере.
2. При этом выполнит два раза операцию конкатенации строк.
3. Инициализирует экземпляр класса String.

Метод с StringBuilder:
1. создаст три строковых объекта в буфере.
2. инициализирует экземпляр StringBuilder.
3. Сделает два раза конкатенацию
4. Выполнит метод toString();

Итого: StringBuilder выполняет "лишний раз" метод toString(). Насколько это замедляет резальтат, зависит от внутренней реализации. Практика показывает, что время на эту операцию по крайней мере пренебрежимо мало по сравнению с временем на остальные операции.

Имхо, данный тест не показывает разницы между String и StringBuffer.

он же
Теоретический вопрос - это что отрабатывает быстрее:
s = s + "VALUE"; strbuf.append("VALUE"); на произвольном (большом) числе итераций.
Однозначно - append.
Причем понятно - почему.

Коллега, а почему?
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032659
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо перевирать вопрос.
Так вы его поставили, ответ очевиден.
Код: plaintext
1.
2.
s = s + "VALUE"; 
strbuf.append("VALUE");
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032673
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feech, я согласен с вами.
Вот, нашел в JSL
JSL
An implementation may choose to perform conversion and concatenation in one step to avoid creating and then discarding an intermediate String object. To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032674
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
примерно год назад здесь обсуждали это. кто-то тогда сказал, что
оптимизатор в байт-код отправит конструкцию со StringBuffer, даже если
написать "SS"+"qq". в качестве доказательства приводил байт-код классов.

или 2 года назад, не помню уже.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032684
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deady
примерно год назад здесь обсуждали это. кто-то тогда сказал, что
оптимизатор в байт-код отправит конструкцию со StringBuffer, даже если
написать "SS"+"qq". в качестве доказательства приводил байт-код классов.

или 2 года назад, не помню уже.
Posted via ActualForum NNTP Server 1.3
зависит от версии JVM.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032697
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feech
Имхо, данный тест не показывает разницы между String и StringBuffer.

см.
он же
В конкретно таком - естественно.
Лучше использовать более простой способ - с String.

и
он же
Итерация в 100000 циклов дает более интересный результат.
В принципе, ожидаемый.


он же
Теоретический вопрос - это что отрабатывает быстрее:
s = s + "VALUE"; strbuf.append("VALUE"); на произвольном (большом) числе итераций.
Однозначно - append.
Причем понятно - почему.

Коллега, а почему?

А вы попробуйте провести такой тест:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 int  n = Integer.parseInt(args[ 0 ]);
		 int  year;
		 long  t1 = System.currentTimeMillis(), t2;
                String s = "";
		 for ( int  i =  0 ; i < n; i++){
			year =  2006 ;
			s = s + "Now "+year+" year";
		}
		t2 = System.currentTimeMillis();
		System.out.println("String Time: " + (t2-t1)/ 1000  + " sec.");

		t1 = System.currentTimeMillis();
                StringBuilder buf =  new  StringBuilder();
		 for ( int  i =  0 ; i < n; i++){
			year =  2006 ;
			buf.append("Now ").append(year).append(" year");
			
		}
                s = buf.toString();
		t2 = System.currentTimeMillis();
		System.out.println("StringBuilder Time: " + (t2-t1)/ 1000  + " sec.");

Вот это и будет ответ на приведенный мной теоретический вопрос:

он же
что отрабатывает быстрее:
s = s + "VALUE"; strbuf.append("VALUE"); на произвольном (большом) числе итераций.
Однозначно - append.
Причем понятно - почему.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032705
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deady
примерно год назад здесь обсуждали это. кто-то тогда сказал, что
оптимизатор в байт-код отправит конструкцию со StringBuffer, даже если
написать "SS"+"qq". в качестве доказательства приводил байт-код классов.

или 2 года назад, не помню уже.
Posted via ActualForum NNTP Server 1.3
Это конкретная ситуация описанная автором. Что будет на самом деле происходить - нужно исследовать.
Зависит от версии JVM.
String = "a" + "b" он действительно переводит в StringBuffer (1.5).
И это ответ почему в первом тесте у нас не было разницы в производительности.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032735
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feech
Кстати, моем тесте не указывайте число итераций больше 10000 - конкатенация строк умирает :)
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032742
Feech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он же
А вы попробуйте провести такой тест:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 int  n = Integer.parseInt(args[ 0 ]);
		 int  year;
		 long  t1 = System.currentTimeMillis(), t2;
                String s = "";
		 for ( int  i =  0 ; i < n; i++){
			year =  2006 ;
			s = s + "Now "+year+" year";
		}
		t2 = System.currentTimeMillis();
		System.out.println("String Time: " + (t2-t1)/ 1000  + " sec.");

		t1 = System.currentTimeMillis();
                StringBuilder buf =  new  StringBuilder();
		 for ( int  i =  0 ; i < n; i++){
			year =  2006 ;
			buf.append("Now ").append(year).append(" year");
			
		}
                s = buf.toString();
		t2 = System.currentTimeMillis();
		System.out.println("StringBuilder Time: " + (t2-t1)/ 1000  + " sec.");

Вот это и будет ответ на приведенный мной теоретический вопрос:

он же
что отрабатывает быстрее:
s = s + "VALUE"; strbuf.append("VALUE"); на произвольном (большом) числе итераций.
Однозначно - append.
Причем понятно - почему.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032749
Feech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он же
А вы попробуйте провести такой тест:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 int  n = Integer.parseInt(args[ 0 ]);
		 int  year;
		 long  t1 = System.currentTimeMillis(), t2;
                String s = "";
		 for ( int  i =  0 ; i < n; i++){
			year =  2006 ;
			s = s + "Now "+year+" year";
		}
		t2 = System.currentTimeMillis();
		System.out.println("String Time: " + (t2-t1)/ 1000  + " sec.");

		t1 = System.currentTimeMillis();
                StringBuilder buf =  new  StringBuilder();
		 for ( int  i =  0 ; i < n; i++){
			year =  2006 ;
			buf.append("Now ").append(year).append(" year");
			
		}
                s = buf.toString();
		t2 = System.currentTimeMillis();
		System.out.println("StringBuilder Time: " + (t2-t1)/ 1000  + " sec.");

Вот это и будет ответ на приведенный мной теоретический вопрос:

он же
что отрабатывает быстрее:
s = s + "VALUE"; strbuf.append("VALUE"); на произвольном (большом) числе итераций.
Однозначно - append.
Причем понятно - почему.


(Сорри, промахнулся)

Я и без теста верю, мне интересно почему. Ноги растут из того факта, что строки immutable?
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032767
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Если сделать
Код: plaintext
1.
s+=s;
До будет создан новый объект типа строки, под который будет отведена память. А это не так быстро, получается. Соответственно, если так сделать 100000 раз, не хватить памяти и JVM умрет (в какой-то момент понадобится 100000-1 и 100000 памяти одновременно).
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032778
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonidv Соответственно, если так сделать 100000 раз, не хватить памяти и JVM умрет (в какой-то момент понадобится 100000-1 и 100000 памяти одновременно).
Особенно учитывая, что GC не будет немедленно чистить старые 100000-2 и 100000-3 блоки памяти.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032828
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет GC это уже другой вопрос. Про него точно ничего в общем сказать нельзя. Вполне возможно, что и будет чистить. А может и не будет. Полная неизвестность :)
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032877
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvДа. Если сделать
Код: plaintext
1.
s+=s;
До будет создан новый объект типа строки, под который будет отведена память. А это не так быстро, получается. Соответственно, если так сделать 100000 раз, не хватить памяти и JVM умрет (в какой-то момент понадобится 100000-1 и 100000 памяти одновременно).
Дык сказали уже, что от версии зависит. 1.4:
Код: plaintext
s+=s;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    3 :    new      # 3 ; //class StringBuffer
    6 :   dup
    7 :   invokespecial   # 4 ; //Method java/lang/StringBuffer."<init>":()V
    10 :  aload_1
    11 :  invokevirtual   # 5 ; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
    14 :  aload_1
    15 :  invokevirtual   # 5 ; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
    18 :  invokevirtual   # 6 ; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
    21 :  astore_1
Т.е. создается StringBuffer (соответственно выделится память под char[16]), дважды вызывается append(), потом toString();
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032918
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вы такую картинку получили? В смысле, с помощью какого инструмента.
...
Рейтинг: 0 / 0
Что быстрее + или StringBuffer?
    #34032977
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvА как вы такую картинку получили? В смысле, с помощью какого инструмента.
Код: plaintext
javap -c < class >
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Что быстрее + или StringBuffer?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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