В моей программе используется определенное количество потоков, каждая из которых выполняет независимую работу. Я использую i7-2600 CPU, но я отключил модуль гиперпотоков, поэтому он запускает 4 потока на 4 ядра. Когда я запускаю программу с 1 потоком, использование процессора составляет 25%, что отлично, поскольку 1 поток полностью используется, но когда я запускаю 4 или 3 потока, я получаю только 60% процессор, почему?Использование многопоточного процессора в C#
Как я уже говорил, потоки полностью независимы (нет блокировок и нет утверждений), также когда я запускаю программу 4 раза с помощью 1 потока, я получаю 100% использование ЦП (т. Е. Когда 4 процесса из 1 потока для каждого процесс я получаю надлежащее использование ЦП)
Любые идеи?
некоторые подробнее:
- Я не использую ввод/вывод при обработке всех необходимых данные загружаются в память, каждый поток загружает свои данные до обработки.
- Я загружаю данные из базы данных (используя oleDb), но проблема, которую я описываю, происходит после загрузки, пока все потоки обрабатываются (загрузка не выполняется).
- Номера:
- 2 нити вокруг 40% вместо 50 (85% для каждой нити).
- 3 нити вокруг 50% вместо 75 (65% для каждой нити).
- 4 потока вокруг 60% вместо 100 (60% для каждой нити).
- Я использую i7 2600 с памятью 16 ГБ, но использование памяти в этом процессе не приближается к этому.
- Я запустил монитор производительности Windows, чтобы искать утверждения, которых нет.
вы делаете блокирующие вызовы ввода/вывода? – ChaosPandion
Это зависит от того, что делает каждый поток, и как вы синхронизируете их между собой и количеством IO, которое вы делаете. Кроме того, в .Net вы не всегда получаете каждый поток на новом CPU – IanNorton
Если они полностью независимы, то они, вероятно, конкурируют за необработанную пропускную способность памяти. Это или кэш-память. –