Перейти к содержанию
    

Тормоза в программе

Всем хорошим привет!

Давно хотел спросить, есть прога выводит скажем картинки с данных, при включении осреднения вывод картинок заметно замедляется 

но нагрузка на процесор в диспечере не изменяется ( скажем 50%),

приоритет в программе выставлен SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

В каком месте тормозит и почему нагрузка на проц не изменяется ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ищите профайлер для вашего языка программирования, запускайте его и смотрите узкие места.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, MegaVolt said:

Ищите профайлер для вашего языка программирования, запускайте его и смотрите узкие места.

Подходит VTune Performaоnce Analyzer но я думал что оптимизировать нужно когда загрузка подходит к 100% ? 

А тут 50% 

5 minutes ago, novikovfb said:

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

Так один поток и есть - вывод, предлагаете осреднение запустить в другом потоке ? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, whale said:

Так один поток и есть - вывод, предлагаете осреднение запустить в другом потоке ? 

точнее - осреднение переписать в многопотоковое, если данные как-то можно разделить на несколько потоков

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, novikovfb said:

точнее - осреднение переписать в многопотоковое, если данные как-то можно разделить на несколько потоков

А как разделить ? Пока все линейно - приходят данные - осредняются -выводятся - ждем данные итд

Разве сделать осреднение и вывод как то паралельно, создать буфер входных данных ? 

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, whale said:

А как разделить ? Пока все линейно - приходят данные - осредняются -выводятся - ждем данные итд

Разве сделать осреднение и вывод как то паралельно, создать буфер входных данных ?

читайте учебники по распараллеливанию алгоритмов обработки данных. Или смиритесь с тем, что получилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, novikovfb said:

читайте учебники по распараллеливанию алгоритмов обработки данных. Или смиритесь с тем, что получилось.

Спасибо, навели на мысль, как нить докумекаем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно проблема аналогичная, что и у плохо сделанного софта мобилок, когда скроллинг списка (допустим, контактов) начинает совершенно неестественно тормозить. Вместо того, чтобы "проскроллить" образ экрана из 4-5-10 пунктов, идет "марлезонский балет", где запрашивается исходная база, список/массив, сортирутеся, делается выборка образа экрана, копируется итд. Со всеми цепочками конструкторов, деструкторов, сортировками и прочими хзч-зачем непроизводительными для скроллинга экрана действиями.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, k155la3 said:

Возможно проблема аналогичная, что и у плохо сделанного софта мобилок, когда скроллинг списка (допустим, контактов) начинает совершенно неестественно тормозить. Вместо того, чтобы "проскроллить" образ экрана из 4-5-10 пунктов, идет "марлезонский балет", где запрашивается исходная база, список/массив, сортирутеся, делается выборка образа экрана, копируется итд. Со всеми цепочками конструкторов, деструкторов, сортировками и прочими хзч-зачем непроизводительными для скроллинга экрана действиями.  

Оптимизировать конечно можно но меня удивило что не растет загрузка процессора, два ядра по 25% а вывод тормозится, всегда думал что вин7 сама распределяет загрузку ядер и тормозит я так понимаю многократный вызов ptr =  (Byte *)gBitmap->ScanLine;

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, whale said:

Оптимизировать конечно можно но меня удивило что не растет загрузка процессора, два ядва по 25% а вывод тормозится, всегда думал что вин7 сама распределяет загрузку ядер. 

"Сама" - сильно сомневаюсь. Скорее когда Вы укажете софту, что этот процесс может/должен выполняться параллельно. Или укажете момент, когда его можно запустить параллельно. Я бы выделил из проекта "подозрительную" по затратам времени часть и провел нагрузочное тестирование. Ну, еще если писано все на ООП/CPP - пересмотрел бы использование объектов-методов (к примеру, вместо массива с добавлением-вконец-удалением-сначала) и выполнением усреднения по всему массиву использовать полносвязный список. Или томуподобное. Это я уже сильно утрирую. Пардон.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, whale сказал:

Оптимизировать конечно можно но меня удивило что не растет загрузка процессора, два ядра по 25% а вывод тормозится

Значит ваша программа чего-то ждёт (какого-то события от win). Потому и загрузка не 100%. Ищите где ожидание происходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jcxz said:

Значит ваша программа чего-то ждёт (какого-то события от win). Потому и загрузка не 100%. Ищите где ожидание происходит.

Не знаю что она может ждать на функции ptr =  (Byte *)gBitmap->ScanLine(i);

Может конечно доступ к массиву такой тормозной но вроде он в  обычной  озу лежит 

 

3 hours ago, k155la3 said:

"Сама" - сильно сомневаюсь. Скорее когда Вы укажете софту, что этот процесс может/должен выполняться параллельно. Или укажете момент, когда его можно запустить параллельно. Я бы выделил из проекта "подозрительную" по затратам времени часть и провел нагрузочное тестирование. Ну, еще если писано все на ООП/CPP - пересмотрел бы использование объектов-методов (к примеру, вместо массива с добавлением-вконец-удалением-сначала) и выполнением усреднения по всему массиву использовать полносвязный список. Или томуподобное. Это я уже сильно утрирую. Пардон.

 

 

Тормоза известны, осреднение по массиву ptr =  (Byte *)gBitmap->ScanLine(i)

Меня больше интересовал вопрос почему проц не загружается. 

Раздает же винда загрузку на два ядра сама.

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, whale сказал:

Не знаю что она может ждать на функции ptr =  (Byte *)gBitmap->ScanLine(i);

Не там. У вас разве программа только из этой строчки состоит?

27 минут назад, whale сказал:

Меня больше интересовал вопрос почему проц не загружается. 

Ещё раз: не загружается потому как происходит ожидание какого то события. На каком-то объекте синхронизации ОС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, jcxz said:

Не там. У вас разве программа только из этой строчки состоит?

Ещё раз: не загружается потому как происходит ожидание какого то события. На каком-то объекте синхронизации ОС.

Комментируем эту строку  и тормоза исчезают

 ptr =  (Byte *)gBitmap->ScanLine(i)

Вполне возможно что доступ к дин массиву gBitmap и тормозит но непонятно почему.

Тут все линейно нет событий, пришли данные по таймеру, залили в gBitmap, осреднили, вывели.

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...