Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
1

Нужно ли явно определять предел в циклах for?

18.05.2019, 18:48. Показов 549. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пусть есть цикл
C#
1
2
3
4
for(int i=0;i<ar.Length;i++)
{
//Какой-то код не изменяющий длину ar
}
Имеет ли смысл
C#
1
2
3
4
5
int length=ar.Length;
for(int i=0;i<length;i++)
{
//Какой-то код не изменяющий длину ar
}
Или компилятор сам определяет, что длина ar в цикле не меняется и подставляет в цикле вместо ar.Length один раз это найденное значение?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2019, 18:48
Ответы с готовыми решениями:

Нужно ли явно уничтожать ADODataSet, ADOCommand и т.д.?
Добрый день! Я вот мучаюсь вопросом, нужно ли явно закрывать компоненты ADODataSet, ADOCommand и...

Зачем нужно явно указывать тип переменной?
Всем привет! Объясните зачем нужно явно указывать тип переменной? Например в С++ это обязательно,...

Почему в Python3 под Wndows нужно явно указывать кодировку?
Добрый день! Как сделать, чтобы Python в Windows воспринимал по дефолту входящие файлы в UTF-8 ? ...

Нужно явно указать где лежит DLL и загрузить с нее форму
Простой примет. Нужно явно указать где лежит DLL и загрузить с нее форму. В примере есть длл...

9
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
18.05.2019, 18:50 2
Данный конкретный случай компилятор оптимизирует сам.
1
Эксперт .NET
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
Цитата Сообщение от kolorotur Посмотреть сообщение
Оставьте ar.Length в условии - компилятор и джиттер соптимизируют как надо.
Цитата Сообщение от Someone007 Посмотреть сообщение
Данный конкретный случай компилятор оптимизирует сам.
Вопрос задал, т.к. в какой-то очень старой книге была рекомендация создания локальной переменной.
А если это не массив, а 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
Цитата Сообщение от korochinskiy Посмотреть сообщение
Если вы посмотрите скомпилированную программу на IL, то увидите, что компилятор оптимизировал код и нет никакой переменной, а в цикле сидит List.Count.
Сидит List.Count или значение List.Count? Т.е. компилятор определяет есть ли Add, Remove, RemoveAt и др. операторы изменяющие длину цикла и если их нет подставляет значение List.Count?
Цитата Сообщение от korochinskiy Посмотреть сообщение
Вообще не рекомендуется использовать for для изменяющейся величины итераций. Для этого надо использовать while.
Можно поподробнее?
0
Эксперт JS
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
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.05.2019, 09:31 8
Цитата Сообщение от amr-now Посмотреть сообщение
статья на Хабре как раз, что не надо записывать array.Length в переменную:
.........
......... вообще советует использовать foreach направо и налево:
Всё зависит от задачи.
foreach удобнее, нагляднее. НО! Он медленнее и выдаст исключение если во время работы цикла коллекция будет изменена.
for (..; i < arr.Length;...) сравнивает каждый раз с текущей длиной массива arr. Если цикл должен работать до текущего (изменяемого) размера массива или сам массив может изменяться, то будет работать правильно. И такой вариант быстрее чем foreach.
Если же по алгоритму массив или его длина могут меняться, а цикл должен работать только до первоначального количества элементов, то уже нужно использовать int count = arr.Length; for (..; i < count;...)
0
Эксперт JS
6492 / 3903 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
19.05.2019, 09:38 9
Элд Хасп, мы рассматриваем в этой теме частный случай, когда
Цитата Сообщение от Passerby Посмотреть сообщение
компилятор сам определяет, что длина ar в цикле не меняется и подставляет в цикле вместо ar.Length один раз это найденное значение
В данном частном случае foreach по мнению разных авторов на разных языках для массива с индексами будет полностью эквивалентен for (var i = 0, len = arr.Length; i < len; ++i)

В JavaScript один из разработчиков движка V8 на конференции тоже объяснял, что JS максимально и тщательно оптимизирует цикл.


Проблемы возникают при затруднениях определения arr.Length. Например, если в цикле вызывается очень сложная функция, где непонятно, меняется ли arr.Length.
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.05.2019, 09:46 10
Цитата Сообщение от amr-now Посмотреть сообщение
В данном частном случае foreach по мнению разных авторов на разных языках для массива с индексами будет полностью эквивалентен for (var i = 0, len = arr.Length; i < len; ++i)
Я сам не проверял, но здесь в разделе была тема в которой тестировались for и foreach на одном и том же наборе. for во всех случаях работал быстрее.
Другое дело, что если тело цикла состоит не из 1-2 операторов, разница между for и foreach становится несущественной по сравнению с выполнением тела цикла.

Цитата Сообщение от amr-now Посмотреть сообщение
Проблемы возникают при затруднениях определения arr.Length. Например, если в цикле вызывается очень сложная функция, где непонятно, меняется ли arr.Length.
Самое большое затруднение это изменение коллекции во время работы foreach.
Если такое возможно, то приходится перед началом цикла коллекцию фиксировать через её дублирование foreach(var item in collection.ToArray()).
0
19.05.2019, 09:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2019, 09:46
Помогаю со студенческими работами здесь

Класс ограничения числа запущенных копий программы. Нужно ли явно освобождать Mutex
Написал класс для ограничения кол-ва запущенных копий программы определённым числом. Я убрал код...

При вынесении определения всегда ли нужно указывать функцию как inline явно?
Бьярни пишет class char_stack { int size; char* top; char* s; public: ...

Для чего нужно определять показатель преломления в ОПТИЧЕСКИХ кристаллах?
Для чего нужно определять показатель преломления в ОПТИЧЕСКИХ кристаллах? Что можем узнать еще,...

Как научиться определять - каким способом нужно решать дифференциальные уравнения?
Здравствуйте, как научиться определять каким способом нужно решать дифференциальные уравнения?...

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

Написал свой MessageBox для WPF. Нужно как-то определять размер окна по кол-ву текста...
Я написал свой MessageBox. И при выводе на него сообщения, я хочу сделать увеличение его размера в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru