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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как работают циклы в java 
:(
    Опции темы
juvf
Дата 6.11.2013, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.6.2010

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



Пример кода
Код

for(int i=0; i<myClass.getSize(); i++)
{
//какой-то полезный код
}


Правильно ли так делать циклы в жаве? Смущает то, что если MyClass::getSize() вернёт 100000, то вызов функции culcSize() будет выполнен 100000 раз. Если тело функции из одной строчки и она не инлайновая, 
Код

MyClass::getSize()
{
return size;
}

то как минимум будет выполнено 100000 входов в функцию getSize() и 100000 выходов. А если гэтСайз - это целый код по вычислению размера, то ещё и этот код будет выполнятся 100000 раз.
Было бы правельнее сделать так
Код

int size = myClass.getSize();
for(int i=0; i<size; i++)
{
//какой-то полезный код
}

Я тонкастями жавы не владею..... Может компилятор жавы сам сделать из 1-го варианта 2-ой и не будет 100000 вызовов?
PM MAIL   Вверх
андрeй
Дата 6.11.2013, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.10.2013

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



Цитата

Я тонкастями жавы не владею..... 

Я тоже,
Цитата

... Может компилятор жавы сам сделать из 1-го варианта 2-ой и не будет 100000 вызовов?

Зачем возлагать на компилятор то, что должен делать программист?  
Второй образец кода неверный, примеры правильного кода можно посмотреть в папке с jdk из  файла src.zip
PM MAIL   Вверх
juvf
Дата 6.11.2013, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.6.2010

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



Код

Второй образец кода неверный, примеры правильного кода можно посмотреть в папке с jdk из  файла src.zip
 А что не верно? Может синтаксис жавы неверен.... я писал c++_like. Если не сложно, дайте в форум правильную версию кода? 

ps хотя на этом же форуме есть пример кода
Код

int cntchars = from + ran.nextInt(to - from+1);
    
    for (int i = 0; i < cntchars; i++) {
//какойто полезный код
    }

Чем мой второй пример кода отличается от этого? 

Это сообщение отредактировал(а) juvf - 6.11.2013, 09:29
PM MAIL   Вверх
андрeй
Дата 6.11.2013, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.10.2013

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



Цитата(juvf @ 6.11.2013,  09:24)
Код

Второй образец кода неверный, примеры правильного кода можно посмотреть в папке с jdk из  файла src.zip
 А что не верно? Может синтаксис жавы неверен.... я писал c++_like. Если не сложно, дайте в форум правильную версию кода? 

ps хотя на этом же форуме есть пример кода
Код

int cntchars = from + ran.nextInt(to - from+1);
    
    for (int i = 0; i < cntchars; i++) {
//какойто полезный код
    }

Чем мой второй пример кода отличается от этого?

Код

MyClass::getSize()
{
return size;
}

Так не сделаешь. Как правильно смотри в пособиях, учебниках и т.п.
PM MAIL   Вверх
Mirkes
Дата 6.11.2013, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 17



Все зависит от того, что может быть в цикле.
Например, если размер MyClass может изменяться в цикле, то корректным будет только вариант
Код

for(int i=0; i<myClass.getSize(); i++)
{
//какой-то полезный код
}

А вот если Вы ТОЧНО ЗНАЕТЕ, что размер меняться не будет, то можно использовать такой вариант
Код

for(int i=0, n=myClass.getSize(); i<n; i++)
{
//какой-то полезный код
}

 Компилятор не способен решить какой из вариантов выбрать, так что решать придется Вам  smile 


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


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.6.2010

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



2Mirkes
конечно если getSize() в течении цыкла меняет возвращяемое значение - тут вероятнее ошибка программирования. речь не об этом.

допустим вы знаете что возвращяемое значение ТОЧНО не изменится. getSize - это обычный геттер

Код

int MyClass::getSize()
{
return size;
}


size равен 100000. на первый взгляд здесь, по крайней мере в с++, видно сто тысяч входов в функцию getSize, и 100 тысяч выходов. Это же на лицо перегрузка процессора ненужными пустыми операциями.  Допустим вход в функцию 16 тактов, выход - ещё 16. как минимум 3 200 000 тактов теряется в таком коде.  А  getSize возвращяет 1 000 000 000 и потоков 100,  И каждый поток выполняет вычисления....
А если getSize не геттер... а он подсчитывает размер таблицы/людей/машин/молекул/чеготоЕщё, или запрашивает кол-во у какойнить базы данных.... да ещё по TCP.... 

Поспрашивал "живых" жава-программистов - автор ответил что так все пишут, другие толком ни чего не могут сказать. Даже если это простой геттер, не знают - будет ли 100000 входов в функцию getSize(). Меня удивило, что они об этом даже не задумываются. Пишут, потому что так все пишут. Интересно, как жава работает.
PM MAIL   Вверх
LSD
Дата 6.11.2013, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(juvf @  6.11.2013,  06:38 Найти цитируемый пост)
Может компилятор жавы сам сделать из 1-го варианта 2-ой и не будет 100000 вызовов?

Первый и второй вариант не эквивалентны. Поэтому компилятор этого делать не будет.

Добавлено через 1 минуту и 16 секунд
Цитата(juvf @  6.11.2013,  13:33 Найти цитируемый пост)
допустим вы знаете что возвращяемое значение ТОЧНО не изменится. getSize - это обычный геттер

Если "вы" точно знаете, то и проведите соответсвующую оптимизацию. Компилятору неоткуда взять эту информацию.


--------------------
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   Вверх
baldina
Дата 6.11.2013, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



juvf,
цикл в форме 
Код

for (type x: container) 
в общем случае эффективней чем
Код

for (int i=0; i < container.size(); ++i)

как раз вынесением вычисления size() из цикла
но вообще java компилятор оптимизирует. как именно, зависит от компилятора.
то, чем вы озабочены, называется преждевременной оптимизацией. делайте код более простым и понятным, оставьте остальное компилятору до того времени, пока производительность достаточна
PM MAIL   Вверх
Mirkes
Дата 6.11.2013, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 17



Цитата(juvf @  6.11.2013,  12:33 Найти цитируемый пост)
2Mirkes
конечно если getSize() в течении цыкла меняет возвращяемое значение - тут вероятнее ошибка программирования. речь не об этом.

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


--------------------
Mirkes
PM MAIL   Вверх
LSD
Дата 6.11.2013, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



baldina 
Первый работает через итератор, а итератор это те же самые 2 вызова метода на каждую итерацию. Вместо size()/get() будет hasNext()/next().


--------------------
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   Вверх
Farmazon
Дата 12.11.2013, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

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



уфф... Если логика метода getSize не очень сложная, то скорее пофигу с точки зрения производительности. В жабе просадку большУю даёт создание объектов и последующая сборка мусора(особенно внезапная, когда не надо), к примеру...
Если логика getSize хитрая(особенно если объекты порождаются), то таки да, будет просадка.

Канонично класс унаследовать от какой-либо реализации(?) Collection и итерировать по ней (или просто одно из полей сделать коллекцией объектов и дать доступ к ней через геттер - это тоже самое, только через композицию)...

Понятнее было бы из контекста задачи, возможно тебе совсем не стоит самому свой контейнер с 0 избретать... Обычно используют готовые коллекции, под конкретные задачи.

А оптимизатор жабы достаточно хитрожоп) http://www.ibm.com/developerworks/ru/library/j-jtp12214/
Как точно будет код работать, нельзя угадать...

Это сообщение отредактировал(а) Farmazon - 12.11.2013, 05:07


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

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

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


 




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


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

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