0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 687
1

Как снизить ресурсопотребление цикла?

12.04.2018, 08:38. Показов 2895. Ответов 18

Здравствуйте. У меня возникла проблема. Я тестировал программу, написанную на C++ с использованием цикла и с помощью диспетчера задач заметил, что потребление ЦП слишком большое(25-30% от всего возможного). Как мне решить эту задачу? Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2018, 08:38
Ответы с готовыми решениями:

Как снизить энергопотребление?
Здравствуйте. У меня есть вопрос как снизить ток для своего проекта. У меня есть ардуино нано ,...

Как снизить нагрузку на ПК
раньшее у меня стояла виндовс 7 домашняя базовая... ела оч мало ресурсов, нагрузка при выключеных...

Как снизить нагрузку на базу
Опишу проблему: Есть база в миллион записей, и скрипт который с ней работает. Скрипт делает...

Как снизить частоту оперативки ?
Подскажите пожалуйста, как мне поменять частоту оперативки ? Начал я разгонять свой проц intel core...

18
Lolobotik
12.04.2018, 09:09
  #2

Не по теме:

Я ехал на машине и смотрел на стрелку бензопака. Оказалось, что потребление бензина слишком большое (20-30 литров на 100 км). Как мне решить эту проблему?

0
Эксперт С++
3064 / 1404 / 423
Регистрация: 19.01.2009
Сообщений: 3,808
12.04.2018, 10:39 3
Sasha38, нужно глядеть код. А вообще данная задача решается с помощью профайлера (их существут огромное множество, для Windows я использую VerySleepy).
0
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 687
12.04.2018, 17:23  [ТС] 4
schdub, код простой
C++
1
2
3
4
int main() {
while(1) {
}
}
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
12.04.2018, 17:37 5
Sasha38, ну вот он и жрет одно ядро.

Решение будет зависеть от решаемой задачи.
C++
1
2
3
4
while(true) {
   //...
   std::this_thread::yield();//но не очень так идея
}
0
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 687
12.04.2018, 18:07  [ТС] 6
Croessmah, у меня не работает Ваш код. Компилятор пишет: IntelliSense: name followed by '::' must be a class or namespace name.
Подключал только iostream.

Добавлено через 4 минуты
Я понял в чём дело. std::this_thread::yield(); - это стандарт C++11, а у меня он старее.
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
12.04.2018, 18:13 7
Лучший ответ Сообщение было отмечено Sasha38 как решение

Решение

Sasha38, тогда можно еще тупее сделать:
C++
1
2
3
4
5
6
7
#include <Windows.h>
//...
 
while(true) {
   //...
   Sleep(0);//но не очень так идея
}
1
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 687
13.04.2018, 08:37  [ТС] 8
Croessmah, спасибо Вам огромное! Вы мне очень помогли!

Добавлено через 13 часов 57 минут
Croessmah, только не Sleep(0), а Sleep(1).
0
19 / 184 / 0
Регистрация: 17.06.2013
Сообщений: 2,163
13.06.2018, 18:52 9
Можно попробовать компилятор поменять.
Цикл может тормозить по причине его многословного перевода на ассемблере.
Или код данного цикла в машин-кодах может чередоваться абы с чем.
Другой вариант это виндовс ассемблер (псевдо ассемблер), занимающий больше ресурсов и на который транслируется программа.
0
308 / 220 / 74
Регистрация: 23.05.2011
Сообщений: 981
13.06.2018, 18:59 10
Да что тут думать-то.

Тут выполняется по факту что-то такое:

Код
begin:
   goto begin;
Программа стремится выполнить последовательно все операции, пока они не закончатся.
В таком цикле будет выполняться за секунду примерно столько же операций, сколько поддерживается одним ядром процессора.

А если добавить Sleep(1), то управление будет передаваться операционке, которая будет будить поток примерно через миллисекунду.
Таким образом, общее число выполнений цикла в секунду уменьшиться с миллиардов до одной тысячи.
0
1365 / 510 / 70
Регистрация: 21.07.2015
Сообщений: 1,289
13.06.2018, 19:04 11
Цитата Сообщение от Sasha38 Посмотреть сообщение
код простой
Этот код специально грузит один логический процессор на 100%. И что удивительного?
0
19 / 184 / 0
Регистрация: 17.06.2013
Сообщений: 2,163
13.06.2018, 19:26 12
Можно ещё рекурсивно вызывать одну и ту же операцию из условного оператора.
Но это работало в Delphi.

Добавлено через 4 минуты
Delphi
1
2
3
4
5
6
Procedure ftl;
 
if  x>5 then 
begin
ftl;
end;
Работает как цикл.
0
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 687
13.06.2018, 19:38  [ТС] 13
Ixmil, спасибо, буду знать.
0
Эксперт .NET
8560 / 5437 / 1294
Регистрация: 25.05.2015
Сообщений: 16,518
Записей в блоге: 14
13.06.2018, 19:45 14
Цитата Сообщение от Sasha38 Посмотреть сообщение
спасибо, буду знать.
Это не решает проблему высокой нагрузки на процессор. Зато попутно забивает память.
1
308 / 220 / 74
Регистрация: 23.05.2011
Сообщений: 981
13.06.2018, 19:50 15
Ixmil, крайне плохой совет.

Это просто забьёт стек и вызовет stack overflow.
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
13.06.2018, 19:59 16
New man, такая бесконечная рекурсия просто UB и, например, clang дает такой выхлоп:
C++
1
2
3
4
5
6
void flt(int x)
{
    if(x < 5) {
        flt(x);
    }
}
Assembler
1
2
flt(int): # @flt(int)
  ret
http://rextester.com/LQYF53558
0
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 687
13.06.2018, 20:20  [ТС] 17
Croessmah, что такое UB?

Добавлено через 16 минут
Ixmil, это в каком компиляторе такой хороший отладчик есть?
0
Эксперт .NET
8560 / 5437 / 1294
Регистрация: 25.05.2015
Сообщений: 16,518
Записей в блоге: 14
13.06.2018, 20:21 18
Цитата Сообщение от Sasha38 Посмотреть сообщение
UB
Неопределённое поведение.
1
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 687
13.06.2018, 20:27  [ТС] 19
Rius, спасибо за ответ.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2018, 20:27
Помогаю со студенческими работами здесь

Как снизить нагрузку на сервер
Сайт созданный на Joomla сильно грузит сервер, приходят сообщения от хостера. Материала на сайте не...

Как снизить нагрев проца?
Старенькая конфа. ECS nForce6M-A AMD Athlon(tm) 64 X2 Dual Core Processor 5200+ Phoenix - Award...

Как снизить температуру процессора?
кто подскажет,как снизить температуру цп??? поднимается до 65*и выкл.

Как снизить шум от компа?
Такое ощущение, что этот гуд мне не идет на пользу, голова плохо соображает. Ставить водяное...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru