Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> видимость переменных, их скорость и нагрузка.. локальные или глобальные в классе? 
:(
    Опции темы
polosatij
  Дата 1.8.2005, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



прет сем =)

вопрос у меня такой..:

Код

public class Example{
  //так? 1.
  int i = 100; 
  
  public int Methode1() {
    //или так? 2.
    int i = 100; 
    //many functions
    return i;
  }
}


Methode1 будет вызнана много раз в программе..
взят буквально простенький пример для понимания.. так как лучше имплементировать перемынные? => меня интересует скорость исполнения.. похоже на то, что первый вариант лучше.. т.к. сборшик мусора не будет севя утруждать этой переменной.. и мало того, память на переменную не будет постоянно заниматься снова и снова.. или я ошибаюсь? smile


--------------------
PM   Вверх
AntonSaburov
Дата 1.8.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Данная переменная будет создаваться в стеке, причем время на ее создание будет пренебрежимо мало по идее. Так что если тебе надо что-то в таком виде, то используй локальную переменную.

Если же тебе надо что-то от Object, то тут экономия будет, т.к. создание объекта - это достаточно длинная операция (относительно).
PM MAIL WWW ICQ   Вверх
Дрон
Дата 1.8.2005, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 93



polosatij
Второй лучше.

Во-первых, это поможет избежать побочных эффектов. Например, если ты вызовешь эту функцию рекурсивно, то первый вариант даст совершенно другие результаты.

Во-вторых, я не могу точно утверждать относительно Java, но в С++ первый вариант будет работать МЕДЛЕННЕЕ, чем второй. Ведь обращение к полю класса происходит через использование указателя this, а к локальной переменной просто работа с вполне определёнными смещениями стека.


--------------------
Да. Именно так.
PM   Вверх
Sardar
Дата 1.8.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Про нарушение логики вообще не говорю. А так, поле класса будет всегда храниться вместе с обьектом, метод обьекта нельзя будет паралельно запустить в нескольких тредах.

Локальная переменная(примитив) к сборщику мусора не имеет никакого отношения, это всего лишь временная ячейка "регистра", которая "исчезнет" при выходе из функции. О сборщике мусора заговоришь когда будешь создавать обьекты, там уже не важно по моему, поле это класса или локальная переменная, обьект будет создан в куче.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
polosatij
Дата 1.8.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(AntonSaburov @ 1.8.2005, 12:48)
Если же тебе надо что-то от Object, то тут экономия будет, т.к. создание объекта - это достаточно длинная операция (относительно).


да.. меня интересуют именно объекты..


Цитата
Во-первых, это поможет избежать побочных эффектов. Например, если ты вызовешь эту функцию рекурсивно, то первый вариант даст совершенно другие результаты.


а если я работаю с объектами? ведь создание и очистка объекта ест много ресурсов?


Цитата(Sardar @ 1.8.2005, 12:55)
Локальная переменная(примитив) к сборщику мусора не имеет никакого отношения, это всего лишь временная ячейка "регистра", которая "исчезнет" при выходе из функции. О сборщике мусора заговоришь когда будешь создавать обьекты, там уже не важно по моему, поле это класса или локальная переменная, обьект будет создан в куче.


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



Цитата(Sardar @ 1.8.2005, 12:55)
Локальная переменная(примитив) к сборщику мусора не имеет никакого отношения, это всего лишь временная ячейка "регистра", которая "исчезнет" при выходе из функции.


серъёзнА smile а я почему-то думал, что все простые переменые тоже "принадлежат" сборщику мусора..



--------------------
PM   Вверх
Дрон
Дата 1.8.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 93



Цитата(polosatij @ 1.8.2005, 15:01)
а если я работаю с объектами? ведь создание и очистка объекта ест много ресурсов?

Ну так ты уточни задачу.

Если так
Код

class MyClass
{
     MyLogger logger;

     public MyClass()
     {
         logger = new MyLogger();
     }

     public void Method1()
     {
         logger.AddEvent("Method1 called");
     }
}

То это, конечно, вполне естественное решение: использовать созданный заранее объект в классе и из метода обращаться к нему.

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

Это сообщение отредактировал(а) Дрон - 1.8.2005, 14:10


--------------------
Да. Именно так.
PM   Вверх
LSD
Дата 1.8.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Память под переменные примитивных типов выделяется в стеке, а память под объекты в куче.
Когда ты пишешь
Код
Object obj;

компилятор выделит место не под объект, а под ссылку на него.

А вот кострукция
Код
new Object()

реально выделит память под объект в куче.


--------------------
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.
PM MAIL WWW   Вверх
Sardar
Дата 1.8.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата(LSD @ 1.8.2005, 13:11)
Память под переменные примитивных типов выделяется в стеке

Причём верхушка стека красиво превращаеться в подобие "регистров", Domestic Cat разбирал байткод и описывал внутренюю работ, вызов методов.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Domestic Cat
Дата 3.8.2005, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Прежде всего, локальная переменная и инстанс-переменная играют разную роль. Инстанс переменная нужна если она характеризует свойство объекта, или является вспомогательной и должна сохранять значение между вызовами методов. Локальная переменная пропадает после завершения метода. Просто пиши такой код, который более подходит к твоей ситуации, а далее проверь - нужны ли тебе инстанс переменные или нет. Если их можно заменить локальными - такой код возможно будет оптимальнее но и (возможно) менее читабельным. Собственно, на таких оптимизациях ты ничего не выиграешь, если переменная - не ссылка на большой массив.


--------------------

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.