Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/26: Рейтинг темы: голосов - 26, средняя оценка - 4.50
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623

Насколько критично обьявление переменной в теле цикла?

28.08.2012, 17:23. Показов 6167. Ответов 66

Студворк — интернет-сервис помощи студентам
Часто приходится иметь дело с циклами в которых используются некоторые специфичные вспомагательные перменные, которые нужны только внутри цикла. Вопрос: как сказывается объявление переменных внутри тела цикла на производительность?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.08.2012, 17:23
Ответы с готовыми решениями:

[C++] объявление переменных в теле цикла
pilot007, во-первых ни когда не объявляй переменные в теле цикла. Во-вторых заголовки циклов наработками по выбору кратчайшего пути не...

В теле цикла for, переменной не присваивается значение
Суть программы в том, чтобы перевести число из десятичной системы в двоичную. Переменные: bin = бинарное число(результат) dec =...

Доступ к переменной, объявленной в теле цикла
Здравствуйте, есть следующий код using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

66
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2012, 22:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Старый надо удалить, так как он уже обработан и не нужен, новый надо поставить на его место. Если это всё спрятать в operator=(), удаления и пересоздания никуда не денутся.
примеры бывают разными

C++
1
2
3
4
5
6
ParserProvider parser (provider);
 
for (File file : files) {
  ParsedFile file_parser = parser.create_file_parser(*file);
  // стопицот операций с file_parser
}
и альтернатива

C++
1
2
3
4
for (File file : files) {
  ParsedFile file_parser = ParserProvider(provider).create_file_parser(*file);
  // стопицот операций с file_parser
}
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
28.08.2012, 22:37
Цитата Сообщение от Toshkarik Посмотреть сообщение
Пусть лучше уж будет один вызов operator=() чем вызов конструктора и деструктора.
Угу, а operator=() внутри ParsedFile всё равно выполнит то же, что и деструктор, так как надо удалить данные с прошлой итерации.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
28.08.2012, 22:42
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Угу, а operator=() внутри ParsedFile всё равно выполнит то же, что и деструктор, так как надо удалить данные с прошлой итерации.
Ну это уже смотря как организован класс, если там используется динамическое выделение памяти, то глупо каждый раз перевыделять и освобождать память, если следующий объект возможно влезет. Да и создание и удаление объектов внутри parsed никто не отменял. Так что по прежнему в этом смысла не вижу.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
28.08.2012, 22:44
Я точно так же не вижу смысла делать за компилятор его работу. Это его головная боль выяснять инварианты цикла.
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
28.08.2012, 22:50
С какой стати он вообще должен это делать с пользовательскими типами? Компилятор делает определенные оптимизации, но не стоит все вешать на него. Я не говорю, что стоит пытаться быть умнее компилятора, но и возлагать на него все тоже не стоит. Я приводил пример, где объект пользовательского типа данных создавался и уничтожался на каждой итерации, причем я это проверял на GCC с флагом -O3.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.08.2012, 03:00
Если объявлять пременную вне цикла - это плохой тон, так как она не локализована... и может далее использоваться кривыми руками...
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2012, 03:04
Цитата Сообщение от Avazart Посмотреть сообщение
for (int i = 0,std::string test ; i < 5; ++i)
оно компилируется?
ибо двойная декларация не должна проходить
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.08.2012, 03:07
Нет не компилируется потому и убрал...
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,765
Записей в блоге: 14
29.08.2012, 07:07
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
А вообще советую не экономить на спичках.
- абсолютно верно! Если не хватает производительности - нужно улучшать алгоритм.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.08.2012, 11:07
Ничего верного. Вот из-за такого мышления и восприятия за "спички" вещей, которые такими не являются, и взваливания все на компилятор, современный софт способен поставить на колени любую современную машину, при этом не делая ничего особенного.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,765
Записей в блоге: 14
29.08.2012, 12:22
Цитата Сообщение от Toshkarik Посмотреть сообщение
восприятия за "спички" вещей, которые такими не являются
- ответ на этот вопрос может дать натурный эксперимент: замерить время выполнения одной и другой программы. И станет ясно, что "спички", а что - нет.

Цитата Сообщение от Toshkarik Посмотреть сообщение
современный софт способен поставить на колени любую современную машину
- примеры?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.08.2012, 12:40
Пожалуйста:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <ctime>
 
 
int main() {
   
   std::clock_t start = std::clock(),
                end;
   
   for ( std::size_t i = 1; i < 100000ul; i++ ) {
      std::vector< unsigned long int > v;
      
      for ( std::size_t j = 0; j < i; j++ )
         v.push_back( j );
   }
   
   end = std::clock();
   
   std::cout << static_cast< double >( end - start ) / CLOCKS_PER_SEC << std::endl;
   
   return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <vector>
#include <ctime>
 
 
int main() {
   
   std::clock_t start = std::clock(),
                end;
   std::vector< unsigned long int > v;
   
   for ( std::size_t i = 1; i < 100000ul; i++ ) {
      v.clear();
      
      for ( std::size_t j = 0; j < i; j++ )
         v.push_back( j );
   }
   
   end = std::clock();
   
   std::cout << static_cast< double >( end - start ) / CLOCKS_PER_SEC << std::endl;
   
   return 0;
}
Первый код у меня выполняется 30 секунд, второй 17. Компилировал gcc с флагом -O2.

Цитата Сообщение от Catstail Посмотреть сообщение
примеры?
В сети много примеров, когда приложение не оправданно использует ресурсы. Выделять какого то отдельного автора ( -ов ) не хотелось бы.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,765
Записей в блоге: 14
29.08.2012, 12:51
Так у Вас в первом коде 100000 раз создается вектор... Понятно, что это менее производительно. Но вопрос-то был про переменную int (которая создается без вызова конструктора). Не думаю, что в этом случае снижение производительности было бы столь заметным.

Добавлено через 2 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
Выделять какого то отдельного автора ( -ов ) не хотелось бы.
давайте взглянем на VS... Она на слабых машинах ворочается медленно не потому, что в MS не умеют программировать. Причина чисто рыночная: стимул покупать новую технику...
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
29.08.2012, 12:53
Цитата Сообщение от Toshkarik Посмотреть сообщение
Первый код у меня выполняется 30 секунд, второй 17. Компилировал gcc с флагом -O2.
Начнём с того, что эти две программы выполняют совершенно различные действия. Выше был более реалистичный пример с ParserFactory. Или ParserProvider, или как там его. Я именно о таких спичках говорю: я не думаю, что стоит фанатично бегать по всей программе и тратить время на вынос всех инвариантов из циклов. Подтирать попку компилятору и выносить их за него стоит только после того, как на 146% известно, что именно этот невынос режет производительность на столько-то процентов и это очень важно.
2
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
30.08.2012, 18:19
Цитата Сообщение от Catstail Посмотреть сообщение
Но вопрос-то был про переменную int
Я изначально говорил о невстроенных типах.

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
я не думаю, что стоит фанатично бегать по всей программе и тратить время на вынос всех инвариантов из циклов.
Чтоб такого не было, нужно изначально писать правильный код. Об этом пишут в многих более-менее нормальных книгах.
Я лишь показал своим примером то, что выделенная память для vector, не освобождается и не перевыделяется на каждой итерации цикла. Тоже самое может быть в классе ParsedFile. Память не будет постоянно освобождаться и выделятся. Только конечно если следующий объект не будет больше, чем предыдущий. Выделение и освобождение памяти слишком ресурсозатратны, что бы их называть спичками.
И опять же вопрос второй раз - с чего Вы вообще взяли, что компилятор должен выносить за цикл объекты, определенные пользователем?

Добавлено через 26 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Если объявлять пременную вне цикла - это плохой тон
С точностью до наоборот.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.08.2012, 18:20
В точности да наоборот.
Покажите мне книгу где так написано ?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
30.08.2012, 18:24
У тех же Дейтелов. Там была даже вроде схема; в начале функции объявляются и инициализируются, если необходимо, объекты, далее идет логика программы, выполняются необходимые действия, ну и в конце возвращается управление.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.08.2012, 18:27
А конкретно страницу,главу из книги ?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
30.08.2012, 18:29
В данный момент лень искать это в книге в полторы тысячи страниц.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.08.2012, 18:31
тем более... как я найду там то о чем вы пишите...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2012, 18:31

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

Насколько критично использование Linux для обучения Ruby?
Всем привет! Смотрю первый урок от hasBrains по Ruby, там автор сильно рекомендует использование Ubuntu или MacOS для обучения Ruby. ...

Насколько критично в плане безопасности использование SSL при POST запросах?
Добрый день! Для обмена информацией САЙТ &lt;-&gt; 1С используются POST запросы (в обе стороны). Насколько критично использовать...

Ошибок парковок очень много (осталась одна красная по Виктоории), а СМАРТ - гуд. Насколько критично?
Доброе время суток! Виктория 4,47: СМАРТ Ошибок парковок ну очень много, а СМАРТ - гуд Под админом выполнил hdparm, появилось в...

вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с использованием одного цикла и что бы все printf были только в теле цикла
вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с использованием одного цикла и что бы все printf были только в теле...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru