powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему создать новый примитив быстрее, чем изменить существующий?
25 сообщений из 29, страница 1 из 2
Почему создать новый примитив быстрее, чем изменить существующий?
    #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
Почему создать новый примитив быстрее, чем изменить существующий?
    #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
Почему создать новый примитив быстрее, чем изменить существующий?
    #38199443
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати изменить примтив нельзя:)
...
Рейтинг: 0 / 0
Почему создать новый примитив быстрее, чем изменить существующий?
    #38199446
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник, после компиляции разве будет разный байт код?
...
Рейтинг: 0 / 0
Почему создать новый примитив быстрее, чем изменить существующий?
    #38199452
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
d2 = 3232
d1 = 3279
d2 = 3224


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

ну попробуй)

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

ну попробуй)

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

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

for() {

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



Компилятор или JVM сам заменит на StringBuffer/Builder, что память не расходовать.
...
Рейтинг: 0 / 0
Почему создать новый примитив быстрее, чем изменить существующий?
    #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
Почему создать новый примитив быстрее, чем изменить существующий?
    #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
Почему создать новый примитив быстрее, чем изменить существующий?
    #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
Почему создать новый примитив быстрее, чем изменить существующий?
    #38199472
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никИзменить примитив нельзя

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

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

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

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

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

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

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

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

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

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

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


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