Jump to content

    

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

Recommended Posts

whale

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

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

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

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

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

 

Share this post


Link to post
Share on other sites

novikovfb

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

Share this post


Link to post
Share on other sites

whale
13 minutes ago, MegaVolt said:

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

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

А тут 50% 

5 minutes ago, novikovfb said:

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

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

Share this post


Link to post
Share on other sites

novikovfb
7 minutes ago, whale said:

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

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

Share this post


Link to post
Share on other sites

whale
6 minutes ago, novikovfb said:

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

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

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

Edited by whale

Share this post


Link to post
Share on other sites

novikovfb
6 minutes ago, whale said:

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

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

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

Share this post


Link to post
Share on other sites

whale
6 minutes ago, novikovfb said:

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

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

Share this post


Link to post
Share on other sites

k155la3

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

Share this post


Link to post
Share on other sites

whale
2 minutes ago, k155la3 said:

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

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

Edited by whale

Share this post


Link to post
Share on other sites

k155la3
13 minutes ago, whale said:

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

whale
2 hours ago, jcxz said:

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

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

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

 

3 hours ago, k155la3 said:

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

 

 

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

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

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

Edited by whale

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

whale
5 minutes ago, jcxz said:

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

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

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

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

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

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

Edited by whale

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.