Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему создать новый примитив быстрее, чем изменить существующий? / 25 сообщений из 29, страница 1 из 2
26.03.2013, 21:21:36
    #38199424
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Здравствуйте.
Почему создать новый примитив быстрее, чем изменить существующий?
Всегда думал, что на самом деле все наоборот, мол изменить переменную быстрее, чем создавать новую.
Вот решил проверить:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
                int size = Integer.MAX_VALUE ;
		int p1 = 0;
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < size; i ++) {
			p1 = i;
		}
		long t2 = System.currentTimeMillis();
		long d1 = t2 - t1;
		System.out.println("d1 = " + d1);
		
		t1 = System.currentTimeMillis();
		for (int i = 0; i < size; i ++) {
			int p2 = i;
		}
		t2 = System.currentTimeMillis();
		long d2 = t2 - t1;
		System.out.println("d2 = " + d2);


Результат:
Код: java
1.
2.
d1 = 9153
d2 = 3230


Почему так получается?
...
Рейтинг: 0 / 0
26.03.2013, 21:41:16
    #38199439
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
а вот так запусти:)
Код: 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.
int size = Integer.MAX_VALUE ;
    	long t1 = System.currentTimeMillis();
		for (int i = 0; i < size; i ++) {
			int p2 = i;
		}
		long t2 = System.currentTimeMillis();
		long d2 = t2 - t1;
		System.out.println("d2 = " + d2);
		int p1 = 0;
		t1 = System.currentTimeMillis();
		for (int i = 0; i < size; i ++) {
			p1 = i;
		}
		t2 = System.currentTimeMillis();
		long d1 = t2 - t1;
		System.out.println("d1 = " + d1);
		
		t1 = System.currentTimeMillis();
		for (int i = 0; i < size; i ++) {
			int p2 = i;
		}
		t2 = System.currentTimeMillis();
		d2 = t2 - t1;
		System.out.println("d2 = " + d2);



Ох уж эти бенчмарки на java......:)
...
Рейтинг: 0 / 0
26.03.2013, 21:42:32
    #38199443
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
кстати изменить примтив нельзя:)
...
Рейтинг: 0 / 0
26.03.2013, 21:43:32
    #38199446
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
забыл ник, после компиляции разве будет разный байт код?
...
Рейтинг: 0 / 0
26.03.2013, 21:46:19
    #38199452
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Код: java
1.
2.
3.
d2 = 3232
d1 = 3279
d2 = 3224


Эм, и в чем причина? )) Что за бенчмарки?
...
Рейтинг: 0 / 0
26.03.2013, 21:46:36
    #38199453
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
rdm,

ну попробуй)

А вообще поясни что ты имел ввиду.
...
Рейтинг: 0 / 0
26.03.2013, 21:47:42
    #38199454
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
забыл никкстати изменить примтив нельзя:)
А где мне про это почитать?
...
Рейтинг: 0 / 0
26.03.2013, 21:51:53
    #38199459
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
забыл никrdm,

ну попробуй)

А вообще поясни что ты имел ввиду.
Я имел ввиду, что нет разницы между объявлением переменной вне цикла и внутри тела цикла.
Компилятор выдаст один байт код.

Вроде бы даже цикла будет такой
Код: java
1.
2.
3.
4.
5.
6.
String a = new String()

for() {

a+= new String(..random..);
}



Компилятор или JVM сам заменит на StringBuffer/Builder, что память не расходовать.
...
Рейтинг: 0 / 0
26.03.2013, 21:54:31
    #38199463
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Паша01
Код: java
1.
2.
3.
d2 = 3232
d1 = 3279
d2 = 3224


Эм, и в чем причина? )) Что за бенчмарки?

Бенчмарк - это то что вы написали, это когда ты меряешь производительность чего-либо.
Так вот, я буквально два дня назад описывал, почему бенчмарки в java так тяжело написать правильно
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1012487&msg=14088086

В твоем случае, вообще непонятно что ты меряешь:) Изменить примитив нельзя, в этом и есть его отличие от объекта, создается он не в куче а на стеке, короче он в любом случае создается, поэтому и время исполнения должно быть примерно одинаковым.
...
Рейтинг: 0 / 0
26.03.2013, 21:57:20
    #38199467
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
rdmКомпилятор или JVM сам заменит на StringBuffer/Builder, что память не расходовать.
Что-то ты не в ту оперу залез, мы вроде другое обсуждаем. Смотри с ArrayList:
Код: 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.
                int size = 100000;

		long t1 = System.currentTimeMillis();
		for (int i = 0; i < size; i++) {
			ArrayList<String> p2 = new ArrayList<String>(i);
		}
		long t2 = System.currentTimeMillis();
		long d2 = t2 - t1;
		System.out.println("d2 = " + d2);
		
		ArrayList<String> p1 = new ArrayList<String>();
		t1 = System.currentTimeMillis();
		for (int i = 0; i < size; i++) {
			p1 = new ArrayList<String>(i);
		}
		t2 = System.currentTimeMillis();
		long d1 = t2 - t1;
		System.out.println("d1 = " + d1);

		t1 = System.currentTimeMillis();
		for (int i = 0; i < size; i++) {
			ArrayList<String> p2 = new ArrayList<String>(i);
		}
		t2 = System.currentTimeMillis();
		long d3 = t2 - t1;
		System.out.println("d3 = " + d3);


Результат:
Код: java
1.
2.
3.
d2 = 13377
d1 = 16418
d3 = 13348
...
Рейтинг: 0 / 0
26.03.2013, 21:58:15
    #38199468
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
rdmЯ имел ввиду, что нет разницы между объявлением переменной вне цикла и внутри тела цикла.
Компилятор выдаст один байт код.

Верно для примтивов, неверно для объектов, коим как раз и является String
rdmВроде бы даже цикла будет такой
Код: java
1.
2.
3.
4.
5.
6.
String a = new String()

for() {

a+= new String(..random..);
}



Компилятор или JVM сам заменит на StringBuffer/Builder, что память не расходовать.
Тоже верно, только при чем тут это?
...
Рейтинг: 0 / 0
26.03.2013, 22:01:05
    #38199472
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
забыл никИзменить примитив нельзя

Как так?! А почему?!
...
Рейтинг: 0 / 0
26.03.2013, 22:03:21
    #38199475
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Паша01,

у меня с эррей листами - такой результат

d2 = 8900
d1 = 7652
d3 = 7604
...
Рейтинг: 0 / 0
26.03.2013, 22:03:51
    #38199476
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
забыл ник, я думаю верно для все неизменяемого. )
...
Рейтинг: 0 / 0
26.03.2013, 22:05:38
    #38199478
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Паша01забыл никИзменить примитив нельзя

Как так?! А почему?!

Ну потому что примитив это ячейка в памяти, у нее нет состояния, она размещена на стеке а не в куче, как в случае с объектом
...
Рейтинг: 0 / 0
27.03.2013, 02:59:34
    #38199763
вникающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
забыл ник,
а если изменить содержимое ячейки памяти, на которую ссылается переменная, то значение данной переменной не изменится?
...
Рейтинг: 0 / 0
27.03.2013, 04:20:03
    #38199814
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Думаю, если бы ты задумался, почему, к примеру, Integer может быть null, а int - нет, что такое куча и стек, об intern-значениях объектов, то подобный вопрос не возникал бы.
...
Рейтинг: 0 / 0
27.03.2013, 05:47:24
    #38199826
вникающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
IDVsbruck,
Да, а какие конкретно мысли, связанные с описанными тобой понятиями, избавили бы меня от подобного вопроса?
...
Рейтинг: 0 / 0
27.03.2013, 08:37:25
    #38199883
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
забыл никНу потому что примитив это ячейка в памяти, у нее нет состояния, она размещена на стеке а не в куче, как в случае с объектом

Ячейка в памяти на то и нужна, чтобы хранить изменяемое состояние, и не важно, на стеке она или в куче.

То, что вы написали, не поддается определению.
...
Рейтинг: 0 / 0
27.03.2013, 10:09:11
    #38199998
вникающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
забыл никИзменить примитив нельзя, в этом и есть его отличие от объекта, создается он не в куче а на стеке, короче он в любом случае создается, поэтому и время исполнения должно быть примерно одинаковым.

Хотелось Бы прояснить:
1) Почему нельзя изменить примитив? Ведь, если создается переменная, то с ней связывается область в памяти. Соответственно, если изменяется содержимое этой области, то изменяется и значение переменной.
2) ИМХО, время доступа к элементу, расположенному на стеке должно быть быстрее, чем к элементу в куче. Или нет?
...
Рейтинг: 0 / 0
27.03.2013, 11:22:57
    #38200129
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Дорогие юниоры, перестаньте бредить. И начните с терминологии.
Переменная - он же ячейка памяти.
Локальная переменная - на стеке.
Поле класса - в куче.
Примитив - тип переменной.
"создать новый примитив" = "создать новый не ссылочный тип переменной" - нельзя в Java создать новый тип.
"изменть примитив" = "изменить тип переменной" - нельзя в Java изменить тип переменной. Статическая типизация.
"изменить значение примитива" - это сокращение от "изменить значение переменой примитивного типе" - это просто операция присвоение.
...
Рейтинг: 0 / 0
27.03.2013, 12:03:00
    #38200203
вникающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Если под словом "примитив" подразумевать примитивный тип данных, а не переменную этого типа, тогда вообще бессмысленно сравнивать "примитив" с объектом, так как "объект" является экземпляром типа данных "класс", а не типом данных.
Что дает основания предполагать, что под "примитивом" в тексте подразумевалась таки "переменная"
...
Рейтинг: 0 / 0
27.03.2013, 12:15:44
    #38200239
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Blazkowicz"изменить значение переменой примитивного типе" - это просто операция присвоение.
Ясно, значит неправильно сформулировал вопрос, вот почему удивился ответу выше. А во время этой операции присвоения нового значения переменной примитивного типа просто переписывается значение ячейки памяти, ничего нового не создается?
...
Рейтинг: 0 / 0
27.03.2013, 12:16:01
    #38200241
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
вникающийЕсли под словом "примитив" подразумевать примитивный тип данных, а не переменную этого типа, тогда вообще бессмысленно сравнивать "примитив" с объектом, так как "объект" является экземпляром типа данных "класс", а не типом данных.
Что дает основания предполагать, что под "примитивом" в тексте подразумевалась таки "переменная"
Отлично! Поэтому когда имеете ввиду "переменную", то и писать стоит про "переменную". А не про "примитив".
...
Рейтинг: 0 / 0
27.03.2013, 12:31:28
    #38200275
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему создать новый примитив быстрее, чем изменить существующий?
Паша01Ясно, значит неправильно сформулировал вопрос, вот почему удивился ответу выше. А во время этой операции присвоения нового значения переменной примитивного типа просто переписывается значение ячейки памяти, ничего нового не создается?
Здесь так много факторов, что сложно перечислить все сразу. Лично вам стоит отложить ненадолго Java и изучить основы ассембелера. Чтобы понять, что такое стэк, как вообще работают инструкции. Стоит так же почитать о компиляторах, как именно они преборазовывают код к инструкции уровня ассемблера.

А вот после этого, когда появиться понимание основ, вы можете посмотреть как выглядит байкт код после компиляции, и оценить что вызвало разницу. Дело в том что код, который вы привели изначально, после компиляции может быть оптимизировать и достаточно сильно отличатся.

И после этого стоит почитать статьи о micro-benchmarking в Java. Дело в том что существует 100500 разных факторов, которые могут влиять на ваш тест. JIT, GC, Server/Client JVM и т.п. Их все стоит учитывать если вам интересны реальные замеры.

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


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