-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
|||||||||||
1 | |||||||||||
Нужно ли явно определять предел в циклах for?18.05.2019, 18:48. Показов 549. Ответов 9
Метки нет (Все метки)
Пусть есть цикл
0
|
18.05.2019, 18:48 | |
Ответы с готовыми решениями:
9
Нужно ли явно уничтожать ADODataSet, ADOCommand и т.д.? Зачем нужно явно указывать тип переменной? Почему в Python3 под Wndows нужно явно указывать кодировку? Нужно явно указать где лежит DLL и загрузить с нее форму |
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
|
|
18.05.2019, 18:50 | 2 |
Данный конкретный случай компилятор оптимизирует сам.
1
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
18.05.2019, 18:51 | 3 |
Если речь именно о массивах, то создание локальной переменной вообще может нанести удар по производительности.
Оставьте ar.Length в условии - компилятор и джиттер соптимизируют как надо.
1
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
|
18.05.2019, 18:57 [ТС] | 4 |
Вопрос задал, т.к. в какой-то очень старой книге была рекомендация создания локальной переменной.
А если это не массив, а List, причем в цикле нет Remove, Add. Надо создавать локальную?
0
|
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
|
18.05.2019, 20:53 | 5 |
Для List тоже нет смысла. Если вы посмотрите скомпилированную программу на IL, то увидите, что компилятор оптимизировал код и нет никакой переменной, а в цикле сидит List.Count. Вообще не рекомендуется использовать for для изменяющейся величины итераций. Для этого надо использовать while.
1
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
|
19.05.2019, 01:46 [ТС] | 6 |
Сидит List.Count или значение List.Count? Т.е. компилятор определяет есть ли Add, Remove, RemoveAt и др. операторы изменяющие длину цикла и если их нет подставляет значение List.Count?
Можно поподробнее?
0
|
6492 / 3903 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
19.05.2019, 06:19 | 7 |
Passerby, Someone007, kolorotur, korochinskiy, статья на Хабре как раз, что не надо записывать array.Length в переменную:
https://habr.com/ru/post/434060/ Добавлено через 57 минут Josh Bloch's Effective Java, item 46 вообще советует использовать foreach направо и налево:Ссылка на PDF
0
|
Модератор
|
|
19.05.2019, 09:31 | 8 |
Всё зависит от задачи.
foreach удобнее, нагляднее. НО! Он медленнее и выдаст исключение если во время работы цикла коллекция будет изменена.for (..; i < arr.Length;...) сравнивает каждый раз с текущей длиной массива arr . Если цикл должен работать до текущего (изменяемого) размера массива или сам массив может изменяться, то будет работать правильно. И такой вариант быстрее чем foreach .Если же по алгоритму массив или его длина могут меняться, а цикл должен работать только до первоначального количества элементов, то уже нужно использовать int count = arr.Length; for (..; i < count;...)
0
|
6492 / 3903 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
19.05.2019, 09:38 | 9 |
Элд Хасп, мы рассматриваем в этой теме частный случай, когда
В данном частном случае
foreach по мнению разных авторов на разных языках для массива с индексами будет полностью эквивалентен for (var i = 0, len = arr.Length; i < len; ++i) В JavaScript один из разработчиков движка V8 на конференции тоже объяснял, что JS максимально и тщательно оптимизирует цикл. Проблемы возникают при затруднениях определения arr.Length. Например, если в цикле вызывается очень сложная функция, где непонятно, меняется ли arr.Length.
0
|
Модератор
|
|
19.05.2019, 09:46 | 10 |
Я сам не проверял, но здесь в разделе была тема в которой тестировались
for и foreach на одном и том же наборе. for во всех случаях работал быстрее.Другое дело, что если тело цикла состоит не из 1-2 операторов, разница между for и foreach становится несущественной по сравнению с выполнением тела цикла.Самое большое затруднение это изменение коллекции во время работы foreach .Если такое возможно, то приходится перед началом цикла коллекцию фиксировать через её дублирование foreach(var item in collection.ToArray()) .
0
|
19.05.2019, 09:46 | |
19.05.2019, 09:46 | |
Помогаю со студенческими работами здесь
10
Класс ограничения числа запущенных копий программы. Нужно ли явно освобождать Mutex При вынесении определения всегда ли нужно указывать функцию как inline явно? Для чего нужно определять показатель преломления в ОПТИЧЕСКИХ кристаллах? Как научиться определять - каким способом нужно решать дифференциальные уравнения? Нужно напечатать буквы в порядке возрастания и в порядке убывания, во вложенных циклах Написал свой MessageBox для WPF. Нужно как-то определять размер окна по кол-ву текста... Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |