Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2017, 11:33   #1
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
Печаль Снижение производительности программы

Здравствуйте, товарищи программисты!
Внезапная проблема настигла меня - резкое (в 2 раза) снижение производительности написанной программы.

Программа представляет собой математическую модель процесса с большим числом частиц. стараясь написать её наиболее эффективно, скомпилировав в режиме Release под 64-х разрядную платформу я надеялся получить результат примерно за 92 часа. В программе я предусмотрел возможность останавливать расчёт и возобновлять его. Всё работало до тех пор, пока я не поставил программу на очередную паузу и перевёл компьютер в спящий режим (его нужно было перевезти в другой город). Запустив программу после "сна" я заметил, что она стала потреблять вдвое меньше вычислительных ресурсов (загрузку ЦП в диспетчере задач смотрел). После нескольких часов работы я проверил промежуточные результаты и убедился в том, что скорость вычислений уменьшилась в 2 раза. Я не был рад этому обстоятельству, ведь расчёт выполнен лишь примерно на 28% я ожидал, что осталось 67 часов до конца, а теперь, получается, мне нужно ещё 6 суток, при условии, что скорость не снизится ещё больше.
Не знаете ли, с чем может быть связано снижение производительности, и можно ли вернуть её к прежним показателям?
Haric_110 вне форума Ответить с цитированием
Старый 02.05.2017, 11:55   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

С необработкой гибернации. Вас ОС просто засвопила и т.д., а ваша прога не вернула все в память. Хотя надо смотреть код...
p51x вне форума Ответить с цитированием
Старый 02.05.2017, 12:14   #3
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
С необработкой гибернации. Вас ОС просто засвопила и т.д., а ваша прога не вернула все в память. Хотя надо смотреть код...
Ну, программа не сверхсекретная, игрушечная, я бы сказал... Код большой, просто... Попробую выложить
Haric_110 вне форума Ответить с цитированием
Старый 02.05.2017, 12:20   #4
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Код:
/*Здесь был код*/

Последний раз редактировалось Haric_110; 03.05.2017 в 10:05. Причина: Убрал код
Haric_110 вне форума Ответить с цитированием
Старый 02.05.2017, 12:21   #5
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

окончание

Код:
/*Здесь был код*/
Вообще, программа продолжает вычислять, но с вдвое меньшей скоростью...

Последний раз редактировалось Haric_110; 03.05.2017 в 10:06. Причина: Убрал код
Haric_110 вне форума Ответить с цитированием
Старый 02.05.2017, 14:37   #6
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

В общем, как я понял, если p51x прав, то навряд ли что-то можно сделать. Пришлось остановить программу. Данные сохранены в файл, из которого буду восстанавливать.
Спасибо за ответ, p51x!
Haric_110 вне форума Ответить с цитированием
Старый 02.05.2017, 14:51   #7
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

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

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

Последний раз редактировалось Haric_110; 02.05.2017 в 15:09.
Haric_110 вне форума Ответить с цитированием
Старый 05.05.2017, 16:09   #8
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Haric_110 Посмотреть сообщение
Кстати, раз уж я код написал, там видно, что хорошо бы передать переменные цикла регистрам процессора... однозначно нужно передать n, и то, что изменяется чаще всего... (это то, что в третьем условном блоке)
Всего четыре регистровой переменной задать можно, не так ли?

Вообще, это не стоит спрашивать здесь...
да и компилятор, вроде, сам определяет, что нужно хранить в регистрах...
Включите оптимизацию для скорости (-O3 для g++). Вообще все команды языка, вроде inline, лишь рекомендации для совр. компиляторов. Они им строго не следуют в любом режиме, кроме -O0 (нет оптимизации).
И вообще, "верьте своему компилятору", и погоняйте "static analyzer" вроде PVSStudio - https://www.viva64.com/ru/pvs-studio/

Кстати, слова вроде const volatile mutable дают сильную подсказку оптимизатору. У меня был случай ускорения в двое, просто верной расстановкой const.

Последний раз редактировалось alexzk; 05.05.2017 в 16:16.
alexzk вне форума Ответить с цитированием
Старый 05.05.2017, 17:39   #9
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Включите оптимизацию для скорости (-O3 для g++). Вообще все команды языка, вроде inline, лишь рекомендации для совр. компиляторов. Они им строго не следуют в любом режиме, кроме -O0 (нет оптимизации).
И вообще, "верьте своему компилятору", и погоняйте "static analyzer" вроде VSStudio - https://www.viva64.com/ru/pvs-studio/
PVSStudio - https://www.viva64.com/ru/pvs-studio/
Кстати, слова вроде const volatile mutable дают сильную подсказку оптимизатору. У меня был случай ускорения в двое, просто верной расстановкой const.
В Visual Studio я пишу) анализатор там так себе...
Запускал в режиме оптимизации. Компилятор, вроде как, правильно выбрал переменные для оптимизации, неиспользуемые константы и переменные удалил. Хотя, не совсем так, как хотел бы я.

Переменную, которой присваивается значение на каждой итерации цикла (n), следовало бы поместить в регистр вместо n_at, которая вообще не используется в цикле. Я увидел это при просмотре локальных переменных во время отладки.
Haric_110 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На сколько разница в производительности? Illusiony SQL, базы данных 4 15.03.2014 16:09
Падение производительности O m n i s Софт 4 30.09.2013 14:58
Информация о производительности Blade Общие вопросы C/C++ 2 24.11.2009 23:04
(предупреждение о производительности) mrandrey Общие вопросы C/C++ 10 25.08.2009 20:49
Снижение аппетита программы Дима я Общие вопросы Delphi 14 12.08.2009 09:46