Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос про ненужную трату ресурсов / 11 сообщений из 11, страница 1 из 1
17.03.2013, 00:49:37
    #38187012
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
Здравствуйте.
У меня вопрос про ненужную трату ресурсов.
Вот пример:
Код: java
1.
2.
Integer a = 5;
a++;


Операция a++ создает новый объект а с новым значением. Хотелось бы спросить, а это не слишком ли растратно. Вроде как создание объекта - это самая ресурсоёмкая операция. А поменять значение переменной примитивного типа int value внутри объекта а менее затратно.
Сделал пример:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        int stepRange = 1000000000;
	
	Integer a = 0;
	long timeBeginA = System.currentTimeMillis();
	for (int i = 0; i < stepRange; i++) {
	    a++;
	}
	long timeEndA = System.currentTimeMillis();
	
	int b = 0;
	long timeBeginB = System.currentTimeMillis();
	for (int i = 0; i < stepRange; i++) {
	    b++;
	}
	long timeEndB = System.currentTimeMillis();

	long timeRangeA = timeEndA - timeBeginA;
	long timeRangeB = timeEndB - timeBeginB;

	System.out.println("time range A = " + timeRangeA);
	System.out.println("time range B = " + timeRangeB);


Результат:
Код: java
1.
2.
time range A = 32697
time range B = 2619


Разница в 12 раз!!!
Почему так не происходит в яве на самом деле, объясните, пожалуйста.
...
Рейтинг: 0 / 0
17.03.2013, 00:54:54
    #38187013
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
...
Рейтинг: 0 / 0
17.03.2013, 01:07:26
    #38187016
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
Ясненько.
...
Рейтинг: 0 / 0
17.03.2013, 04:58:03
    #38187043
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
Паша01Здравствуйте.
У меня вопрос про ненужную трату ресурсов.
Вот пример:
Код: java
1.
2.
Integer a = 5;
a++;



Операция a++ создает новый объект а с новым значением. Хотелось бы спросить, а это не слишком ли растратно. Вроде как создание объекта - это самая ресурсоёмкая операция. А поменять значение переменной примитивного типа int value внутри объекта а менее затратно.
Сделал пример:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        int stepRange = 1000000000;
	
	Integer a = 0;
	long timeBeginA = System.currentTimeMillis();
	for (int i = 0; i < stepRange; i++) {
	    a++;
	}
	long timeEndA = System.currentTimeMillis();
	
	int b = 0;
	long timeBeginB = System.currentTimeMillis();
	for (int i = 0; i < stepRange; i++) {
	    b++;
	}
	long timeEndB = System.currentTimeMillis();

	long timeRangeA = timeEndA - timeBeginA;
	long timeRangeB = timeEndB - timeBeginB;

	System.out.println("time range A = " + timeRangeA);
	System.out.println("time range B = " + timeRangeB);



Результат:
Код: java
1.
2.
time range A = 32697
time range B = 2619



Разница в 12 раз!!!
Почему так не происходит в яве на самом деле, объясните, пожалуйста.ссылочная прозрачность, все дела.

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

Пример.

int a = 0;
int b = a;
a++;
//b = 0, a = 1

Если бы Интегер был мутабельный

Integer a = 0;
Integer b = a;
a++;
//b = 1, a = 1 - расход в семантике, такие дела...
...
Рейтинг: 0 / 0
17.03.2013, 13:26:03
    #38187141
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
Плагин FindBug рекомендует использовать кеши (или пулы) готовых Integer объектов.
Они покрывают не весь диапазон но ЕМНИП для -128 до 127 кешируются Byte, Short,
Integer только нужно использовать соотв. не конструктор а статический метод
возврата объекта.
...
Рейтинг: 0 / 0
17.03.2013, 13:32:53
    #38187144
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
Плюс еще можно почитать про flyweight
...
Рейтинг: 0 / 0
17.03.2013, 14:26:41
    #38187169
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
ZyK_BotaNInteger a = 0;
Integer b = a;
a++;
//b = 1, a = 1 - расход в семантике, такие дела...
Это понятно, просто не сразу понял, почему запретили менять содержимое объекту класса-оболочки, а создают новый объект.
...
Рейтинг: 0 / 0
17.03.2013, 14:47:20
    #38187177
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
Паша01ZyK_BotaNInteger a = 0;
Integer b = a;
a++;
//b = 1, a = 1 - расход в семантике, такие дела...
Это понятно, просто не сразу понял, почему запретили менять содержимое объекту класса-оболочки, а создают новый объект.Сначала нужно понять, зачем ввели классы оболочки?

А поведение оставили таким же, что-бы можно было не задумываясь переписать алгоритм.
Т.е. несли алгоритм выдает разный результат, при замене инта на Интеджер - то это не дело.
...
Рейтинг: 0 / 0
17.03.2013, 14:50:37
    #38187179
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
Паша01,

вот в хаскеле - все объекты иммутабельны, и ниче - производительность, обычно, повыше чем у джавы.

правда там принципиально другой рантайм, рассчитанный на очень частую реаллокацию маленьких объектов.
Но я правда думаю, что хаскель реализованный по верх jvm - будет ацки тормозить.
...
Рейтинг: 0 / 0
17.03.2013, 21:01:32
    #38187353
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
ZyK_BotaNСначала нужно понять, зачем ввели классы оболочки?
Что-то я полазил в интернете и так не нашел внятного ответа. Как я понял, виртуальная машина явы спроектированна под работу с объектами. А добавить туда возможность делать вот так
Код: java
1.
ArrrayList<int> array = new ArrrayList<int>();


обошлось бы в громоздкие изменения в этой виртуальной машине явы и ,возможно, в ещё какие-то проблемы. Поэтому разработчики решили оставить все как есть, прикрыв этот недочет классами-оболочками в ущерб производительности.
...
Рейтинг: 0 / 0
17.03.2013, 21:26:40
    #38187368
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про ненужную трату ресурсов
Паша01ZyK_BotaNСначала нужно понять, зачем ввели классы оболочки?
Что-то я полазил в интернете и так не нашел внятного ответа. Как я понял, виртуальная машина явы спроектированна под работу с объектами. А добавить туда возможность делать вот так
Код: java
1.
ArrrayList<int> array = new ArrrayList<int>();



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


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