whale 0 Posted May 11 · Report post Всем хорошим привет! Давно хотел спросить, есть прога выводит скажем картинки с данных, при включении осреднения вывод картинок заметно замедляется но нагрузка на процесор в диспечере не изменяется ( скажем 50%), приоритет в программе выставлен SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); В каком месте тормозит и почему нагрузка на проц не изменяется ? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
MegaVolt 0 Posted May 11 · Report post Ищите профайлер для вашего языка программирования, запускайте его и смотрите узкие места. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
novikovfb 0 Posted May 11 · Report post нагрузка на процессор может не меняться, если программа использует только один поток, поэтому может загрузить только одно ядро из всех имеющихся. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
whale 0 Posted May 11 · Report post 13 minutes ago, MegaVolt said: Ищите профайлер для вашего языка программирования, запускайте его и смотрите узкие места. Подходит VTune Performaоnce Analyzer но я думал что оптимизировать нужно когда загрузка подходит к 100% ? А тут 50% 5 minutes ago, novikovfb said: нагрузка на процессор может не меняться, если программа использует только один поток, поэтому может загрузить только одно ядро из всех имеющихся. Так один поток и есть - вывод, предлагаете осреднение запустить в другом потоке ? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
novikovfb 0 Posted May 11 · Report post 7 minutes ago, whale said: Так один поток и есть - вывод, предлагаете осреднение запустить в другом потоке ? точнее - осреднение переписать в многопотоковое, если данные как-то можно разделить на несколько потоков Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
whale 0 Posted May 11 (edited) · Report post 6 minutes ago, novikovfb said: точнее - осреднение переписать в многопотоковое, если данные как-то можно разделить на несколько потоков А как разделить ? Пока все линейно - приходят данные - осредняются -выводятся - ждем данные итд Разве сделать осреднение и вывод как то паралельно, создать буфер входных данных ? Edited May 11 by whale Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
novikovfb 0 Posted May 11 · Report post 6 minutes ago, whale said: А как разделить ? Пока все линейно - приходят данные - осредняются -выводятся - ждем данные итд Разве сделать осреднение и вывод как то паралельно, создать буфер входных данных ? читайте учебники по распараллеливанию алгоритмов обработки данных. Или смиритесь с тем, что получилось. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
whale 0 Posted May 11 · Report post 6 minutes ago, novikovfb said: читайте учебники по распараллеливанию алгоритмов обработки данных. Или смиритесь с тем, что получилось. Спасибо, навели на мысль, как нить докумекаем. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
k155la3 2 Posted May 11 · Report post Возможно проблема аналогичная, что и у плохо сделанного софта мобилок, когда скроллинг списка (допустим, контактов) начинает совершенно неестественно тормозить. Вместо того, чтобы "проскроллить" образ экрана из 4-5-10 пунктов, идет "марлезонский балет", где запрашивается исходная база, список/массив, сортирутеся, делается выборка образа экрана, копируется итд. Со всеми цепочками конструкторов, деструкторов, сортировками и прочими хзч-зачем непроизводительными для скроллинга экрана действиями. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
whale 0 Posted May 11 (edited) · Report post 2 minutes ago, k155la3 said: Возможно проблема аналогичная, что и у плохо сделанного софта мобилок, когда скроллинг списка (допустим, контактов) начинает совершенно неестественно тормозить. Вместо того, чтобы "проскроллить" образ экрана из 4-5-10 пунктов, идет "марлезонский балет", где запрашивается исходная база, список/массив, сортирутеся, делается выборка образа экрана, копируется итд. Со всеми цепочками конструкторов, деструкторов, сортировками и прочими хзч-зачем непроизводительными для скроллинга экрана действиями. Оптимизировать конечно можно но меня удивило что не растет загрузка процессора, два ядра по 25% а вывод тормозится, всегда думал что вин7 сама распределяет загрузку ядер и тормозит я так понимаю многократный вызов ptr = (Byte *)gBitmap->ScanLine; Edited May 11 by whale Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
k155la3 2 Posted May 11 · Report post 13 minutes ago, whale said: Оптимизировать конечно можно но меня удивило что не растет загрузка процессора, два ядва по 25% а вывод тормозится, всегда думал что вин7 сама распределяет загрузку ядер. "Сама" - сильно сомневаюсь. Скорее когда Вы укажете софту, что этот процесс может/должен выполняться параллельно. Или укажете момент, когда его можно запустить параллельно. Я бы выделил из проекта "подозрительную" по затратам времени часть и провел нагрузочное тестирование. Ну, еще если писано все на ООП/CPP - пересмотрел бы использование объектов-методов (к примеру, вместо массива с добавлением-вконец-удалением-сначала) и выполнением усреднения по всему массиву использовать полносвязный список. Или томуподобное. Это я уже сильно утрирую. Пардон. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jcxz 4 Posted May 11 · Report post 27 минут назад, whale сказал: Оптимизировать конечно можно но меня удивило что не растет загрузка процессора, два ядра по 25% а вывод тормозится Значит ваша программа чего-то ждёт (какого-то события от win). Потому и загрузка не 100%. Ищите где ожидание происходит. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
whale 0 Posted May 11 (edited) · Report post 2 hours ago, jcxz said: Значит ваша программа чего-то ждёт (какого-то события от win). Потому и загрузка не 100%. Ищите где ожидание происходит. Не знаю что она может ждать на функции ptr = (Byte *)gBitmap->ScanLine(i); Может конечно доступ к массиву такой тормозной но вроде он в обычной озу лежит 3 hours ago, k155la3 said: "Сама" - сильно сомневаюсь. Скорее когда Вы укажете софту, что этот процесс может/должен выполняться параллельно. Или укажете момент, когда его можно запустить параллельно. Я бы выделил из проекта "подозрительную" по затратам времени часть и провел нагрузочное тестирование. Ну, еще если писано все на ООП/CPP - пересмотрел бы использование объектов-методов (к примеру, вместо массива с добавлением-вконец-удалением-сначала) и выполнением усреднения по всему массиву использовать полносвязный список. Или томуподобное. Это я уже сильно утрирую. Пардон. Тормоза известны, осреднение по массиву ptr = (Byte *)gBitmap->ScanLine(i); Меня больше интересовал вопрос почему проц не загружается. Раздает же винда загрузку на два ядра сама. Edited May 11 by whale Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jcxz 4 Posted May 11 · Report post 27 минут назад, whale сказал: Не знаю что она может ждать на функции ptr = (Byte *)gBitmap->ScanLine(i); Не там. У вас разве программа только из этой строчки состоит? 27 минут назад, whale сказал: Меня больше интересовал вопрос почему проц не загружается. Ещё раз: не загружается потому как происходит ожидание какого то события. На каком-то объекте синхронизации ОС. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
whale 0 Posted May 11 (edited) · Report post 5 minutes ago, jcxz said: Не там. У вас разве программа только из этой строчки состоит? Ещё раз: не загружается потому как происходит ожидание какого то события. На каком-то объекте синхронизации ОС. Комментируем эту строку и тормоза исчезают ptr = (Byte *)gBitmap->ScanLine(i); Вполне возможно что доступ к дин массиву gBitmap и тормозит но непонятно почему. Тут все линейно нет событий, пришли данные по таймеру, залили в gBitmap, осреднили, вывели. Edited May 11 by whale Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...