![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
juvf |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Пример кода
Правильно ли так делать циклы в жаве? Смущает то, что если MyClass::getSize() вернёт 100000, то вызов функции culcSize() будет выполнен 100000 раз. Если тело функции из одной строчки и она не инлайновая,
то как минимум будет выполнено 100000 входов в функцию getSize() и 100000 выходов. А если гэтСайз - это целый код по вычислению размера, то ещё и этот код будет выполнятся 100000 раз. Было бы правельнее сделать так
Я тонкастями жавы не владею..... Может компилятор жавы сам сделать из 1-го варианта 2-ой и не будет 100000 вызовов? |
||||||
|
|||||||
андрeй |
|
||||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 23.10.2013 Репутация: нет Всего: нет |
Я тоже,
Зачем возлагать на компилятор то, что должен делать программист? Второй образец кода неверный, примеры правильного кода можно посмотреть в папке с jdk из файла src.zip |
||||
|
|||||
juvf |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
ps хотя на этом же форуме есть пример кода
Чем мой второй пример кода отличается от этого? Это сообщение отредактировал(а) juvf - 6.11.2013, 09:29 |
||||
|
|||||
андрeй |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 23.10.2013 Репутация: нет Всего: нет |
Так не сделаешь. Как правильно смотри в пособиях, учебниках и т.п. |
||||||||
|
|||||||||
Mirkes |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Все зависит от того, что может быть в цикле.
Например, если размер MyClass может изменяться в цикле, то корректным будет только вариант
А вот если Вы ТОЧНО ЗНАЕТЕ, что размер меняться не будет, то можно использовать такой вариант
Компилятор не способен решить какой из вариантов выбрать, так что решать придется Вам ![]() -------------------- Mirkes |
||||
|
|||||
juvf |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
2Mirkes
конечно если getSize() в течении цыкла меняет возвращяемое значение - тут вероятнее ошибка программирования. речь не об этом. допустим вы знаете что возвращяемое значение ТОЧНО не изменится. getSize - это обычный геттер
size равен 100000. на первый взгляд здесь, по крайней мере в с++, видно сто тысяч входов в функцию getSize, и 100 тысяч выходов. Это же на лицо перегрузка процессора ненужными пустыми операциями. Допустим вход в функцию 16 тактов, выход - ещё 16. как минимум 3 200 000 тактов теряется в таком коде. А getSize возвращяет 1 000 000 000 и потоков 100, И каждый поток выполняет вычисления.... А если getSize не геттер... а он подсчитывает размер таблицы/людей/машин/молекул/чеготоЕщё, или запрашивает кол-во у какойнить базы данных.... да ещё по TCP.... Поспрашивал "живых" жава-программистов - автор ответил что так все пишут, другие толком ни чего не могут сказать. Даже если это простой геттер, не знают - будет ли 100000 входов в функцию getSize(). Меня удивило, что они об этом даже не задумываются. Пишут, потому что так все пишут. Интересно, как жава работает. |
|||
|
||||
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Первый и второй вариант не эквивалентны. Поэтому компилятор этого делать не будет. Добавлено через 1 минуту и 16 секунд
Если "вы" точно знаете, то и проведите соответсвующую оптимизацию. Компилятору неоткуда взять эту информацию. -------------------- 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. |
||||
|
|||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
juvf,
цикл в форме
как раз вынесением вычисления size() из цикла но вообще java компилятор оптимизирует. как именно, зависит от компилятора. то, чем вы озабочены, называется преждевременной оптимизацией. делайте код более простым и понятным, оставьте остальное компилятору до того времени, пока производительность достаточна |
||||
|
|||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Почему же ошибка программирования, бывают разные задачи, иногда в ходе перебора увеличивается размер перебираемой коллекции. Это нормально. Именно поэтому компилятор не может знать меняется значение или нет. -------------------- Mirkes |
|||
|
||||
LSD |
|
|||
![]() 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. |
|||
|
||||
Farmazon |
|
|||
![]() Разработчик ![]() ![]() Профиль Группа: Участник Сообщений: 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 -------------------- Таково моё общее мнение. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |