2015-03-08 2 views
0

Я пишу приложение C++ с помощью Visual Studio 2013. Приложение выполняет итерацию с помощью изображения, выполняющего сложный анализ. Чтобы проверить эффективность кода, я выполняю анализ (скажем) 100 раз и вижу, сколько времени потребуется. Затем я изменяю код, повторно запускаю тест и вижу, есть ли улучшение (или ухудшение) производительности.Максимальное использование ОС Windows 8.1 <= 30%

Проблема в том, что, хотя у меня есть мощный 4-ядерный i5 (i5-4200U @ 1,6 ГГц, чтобы быть конкретным) и достаточное количество ОЗУ, общее использование ЦП не превышает около 30%. Мой процесс никогда не выходит за рамки около 29,5%. Я попытался установить класс приоритета моего приложения на «Высокий» (используя SetProcessPriority), и это не поможет. Существует нулевой диск и сетевой доступ, все в памяти (и около 5 ГБ памяти, чтобы сэкономить).

Является ли это какой-то секретной установкой Windows 8.1 (чтобы сохранить производительность)? Могу ли я изменить это программно или через некоторый апплет панели управления?

+0

В зависимости от того, как вы получаете цифру 30%, это может быть ссылка на долю всего поля: 30% четырехъядерного блока - это одно ядро ​​и бит. Используется ли ваше приложение для использования нескольких ядер? – NPE

+0

Нет, не особо. Я просто прошу Windows «пропустить анализ X раз». Я не думаю, что задача «атомарна» и может быть легко распределена между процессорами. Хм ... это уместно? В диспетчере задач я отмечаю, что использование ЦП для каждого ядра примерно одинаковое. – AlainD

+0

Похоже, ваше приложение не предназначено для использования нескольких ядер и насыщает одно ядро. Чтобы повысить производительность, вам нужно либо сделать однопоточный код более эффективным, либо найти способ использования нескольких ядер. – NPE

ответ

4

Хорошо, как вы ожидаете, что ваше приложение будет использовать 100% -ный процессор, если он (скорее всего) работает только на одном ядре, потому что вы не используете потоки?

30% немного выше использования для одного сердечника (25%), поэтому почти наверняка вы не используете потоки здесь.

+0

В более старых версиях однопоточного кода Windows одно ядро ​​будет иметь тенденцию максимизировать, в то время как остальные будут преследовать около 0%. Похоже, что Windows 8.1 распределяет работу для одного потока равномерно по всем ядрам. Если я установил приоритет процесса на «Высокий», то индивидуальные привычки ядра станут менее однородными, и они будут более похожими на предыдущие версии Windows в том, что одно основное использование идет правильно. В целом время обработки не улучшается, устанавливая приоритет процесса на «Высокий». – AlainD

+0

@AlainD Один процесс почти всегда максимизирует одно ядро ​​или чередуется с тем, какие ядра он выполняет (из-за переключения задач). Он не может работать сразу на нескольких ядрах без потоков. Я не уверен, как вы можете видеть это поведение честным. – alternative

+0

Я тоже был удивлен. Вместо того, чтобы максимизировать одно ядро, как я ожидал, уровни на каждом ядре составляли около 30%. Я запускал приложение много раз с небольшими изменениями (всегда однопоточными), и каждый раз он делал то же самое. Я думаю, что это должна быть ОС (Windows 8.1) или (что менее вероятно) код, созданный IDE (VS 2013), распространяющий нагрузку. – AlainD

Смежные вопросы