Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Что быстрее + или StringBuffer? / 24 сообщений из 24, страница 1 из 1
04.10.2006, 16:19:06
    #34032383
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Что должно быстрее отработать:
Код: 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
04.10.2006, 16:33:13
    #34032443
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
А самому проверить?
...
Рейтинг: 0 / 0
04.10.2006, 16:37:46
    #34032464
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Не заметишь разницу в таком тесте.
...
Рейтинг: 0 / 0
04.10.2006, 16:38:31
    #34032470
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
TimmНе заметишь разницу в таком тесте.
В конкретно таком - естественно.
Лучше использовать более простой способ - с String.
...
Рейтинг: 0 / 0
04.10.2006, 16:39:06
    #34032475
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Итерация в 100000 циклов дает более интересный результат.
В принципе, ожидаемый.
...
Рейтинг: 0 / 0
04.10.2006, 16:42:52
    #34032489
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Так какой результат ожидаемый? Это теоретический вопрос, а не практический.
...
Рейтинг: 0 / 0
04.10.2006, 17:18:26
    #34032635
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
LeonidvТак какой результат ожидаемый? Это теоретический вопрос, а не практический.
теоретически это практический вопрос, поэтому х его з.
...
Рейтинг: 0 / 0
04.10.2006, 17:20:10
    #34032643
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
LeonidvТак какой результат ожидаемый? Это теоретический вопрос, а не практический.

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

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

Код: 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
04.10.2006, 17:24:25
    #34032659
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Не надо перевирать вопрос.
Так вы его поставили, ответ очевиден.
Код: plaintext
1.
2.
s = s + "VALUE"; 
strbuf.append("VALUE");
...
Рейтинг: 0 / 0
04.10.2006, 17:28:39
    #34032673
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
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
04.10.2006, 17:28:42
    #34032674
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
примерно год назад здесь обсуждали это. кто-то тогда сказал, что
оптимизатор в байт-код отправит конструкцию со StringBuffer, даже если
написать "SS"+"qq". в качестве доказательства приводил байт-код классов.

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

или 2 года назад, не помню уже.
Posted via ActualForum NNTP Server 1.3
зависит от версии JVM.
...
Рейтинг: 0 / 0
04.10.2006, 17:33:43
    #34032697
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
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
04.10.2006, 17:35:06
    #34032705
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Deady
примерно год назад здесь обсуждали это. кто-то тогда сказал, что
оптимизатор в байт-код отправит конструкцию со StringBuffer, даже если
написать "SS"+"qq". в качестве доказательства приводил байт-код классов.

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

Код: 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
04.10.2006, 17:48:57
    #34032749
Feech
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
он же
А вы попробуйте провести такой тест:

Код: 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
04.10.2006, 17:54:02
    #34032767
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Да. Если сделать
Код: plaintext
1.
s+=s;
До будет создан новый объект типа строки, под который будет отведена память. А это не так быстро, получается. Соответственно, если так сделать 100000 раз, не хватить памяти и JVM умрет (в какой-то момент понадобится 100000-1 и 100000 памяти одновременно).
...
Рейтинг: 0 / 0
04.10.2006, 17:56:55
    #34032778
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Leonidv Соответственно, если так сделать 100000 раз, не хватить памяти и JVM умрет (в какой-то момент понадобится 100000-1 и 100000 памяти одновременно).
Особенно учитывая, что GC не будет немедленно чистить старые 100000-2 и 100000-3 блоки памяти.
...
Рейтинг: 0 / 0
04.10.2006, 18:07:43
    #34032828
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
Насчет GC это уже другой вопрос. Про него точно ничего в общем сказать нельзя. Вполне возможно, что и будет чистить. А может и не будет. Полная неизвестность :)
...
Рейтинг: 0 / 0
04.10.2006, 18:21:15
    #34032877
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
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
04.10.2006, 18:35:23
    #34032918
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
А как вы такую картинку получили? В смысле, с помощью какого инструмента.
...
Рейтинг: 0 / 0
04.10.2006, 18:56:53
    #34032977
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее + или StringBuffer?
LeonidvА как вы такую картинку получили? В смысле, с помощью какого инструмента.
Код: plaintext
javap -c < class >
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Что быстрее + или StringBuffer? / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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