![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
polosatij |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: 1 Всего: 8 |
прет сем =)
вопрос у меня такой..:
Methode1 будет вызнана много раз в программе.. взят буквально простенький пример для понимания.. так как лучше имплементировать перемынные? => меня интересует скорость исполнения.. похоже на то, что первый вариант лучше.. т.к. сборшик мусора не будет севя утруждать этой переменной.. и мало того, память на переменную не будет постоянно заниматься снова и снова.. или я ошибаюсь? ![]() |
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Данная переменная будет создаваться в стеке, причем время на ее создание будет пренебрежимо мало по идее. Так что если тебе надо что-то в таком виде, то используй локальную переменную.
Если же тебе надо что-то от Object, то тут экономия будет, т.к. создание объекта - это достаточно длинная операция (относительно). |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 6 Всего: 93 |
polosatij
Второй лучше. Во-первых, это поможет избежать побочных эффектов. Например, если ты вызовешь эту функцию рекурсивно, то первый вариант даст совершенно другие результаты. Во-вторых, я не могу точно утверждать относительно Java, но в С++ первый вариант будет работать МЕДЛЕННЕЕ, чем второй. Ведь обращение к полю класса происходит через использование указателя this, а к локальной переменной просто работа с вполне определёнными смещениями стека. -------------------- Да. Именно так. |
|||
|
||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Про нарушение логики вообще не говорю. А так, поле класса будет всегда храниться вместе с обьектом, метод обьекта нельзя будет паралельно запустить в нескольких тредах.
Локальная переменная(примитив) к сборщику мусора не имеет никакого отношения, это всего лишь временная ячейка "регистра", которая "исчезнет" при выходе из функции. О сборщике мусора заговоришь когда будешь создавать обьекты, там уже не важно по моему, поле это класса или локальная переменная, обьект будет создан в куче. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
polosatij |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: 1 Всего: 8 |
да.. меня интересуют именно объекты..
а если я работаю с объектами? ведь создание и очистка объекта ест много ресурсов?
не понял.. ведь при выходе из финкции сборшик мусора будет думать, что объект не нужен.. и сотрёт его.. и при этом (возможно) будет сразу же положен второй такой же обьект.. и третий.. и т.д.
серъёзнА ![]() |
||||||||
|
|||||||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 6 Всего: 93 |
Ну так ты уточни задачу. Если так
То это, конечно, вполне естественное решение: использовать созданный заранее объект в классе и из метода обращаться к нему. Но если каждый вызов функции требует создания нового объекта, то выигрышь в быстродействии мы точно не получим. Это сообщение отредактировал(а) Дрон - 1.8.2005, 14:10 -------------------- Да. Именно так. |
||||
|
|||||
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Память под переменные примитивных типов выделяется в стеке, а память под объекты в куче.
Когда ты пишешь
компилятор выделит место не под объект, а под ссылку на него. А вот кострукция
реально выделит память под объект в куче. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Причём верхушка стека красиво превращаеться в подобие "регистров", Domestic Cat разбирал байткод и описывал внутренюю работ, вызов методов. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Прежде всего, локальная переменная и инстанс-переменная играют разную роль. Инстанс переменная нужна если она характеризует свойство объекта, или является вспомогательной и должна сохранять значение между вызовами методов. Локальная переменная пропадает после завершения метода. Просто пиши такой код, который более подходит к твоей ситуации, а далее проверь - нужны ли тебе инстанс переменные или нет. Если их можно заменить локальными - такой код возможно будет оптимальнее но и (возможно) менее читабельным. Собственно, на таких оптимизациях ты ничего не выиграешь, если переменная - не ссылка на большой массив.
-------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |