(См. Ответ Роберта Макки, хотя, возможно, это может быть связано с дисковым вводом-выводом, но, возможно, нет.)
Итак, я раньше не использовал Paralell.ForEach
, но, похоже, вы должны запустить свой UniqPicture
метод параллельно для всех файлов в данном каталоге.Я думаю, что ваш подход здесь хорош, но в конечном итоге ваш жесткий диск, вероятно, убивает скорость вашей программы (и наоборот).
Вы пытались запустить UniqPicture
в цикле последовательно?Я обеспокоен тем, что твой жесткий диск может сломаться.Но в целом, наиболее вероятно, что ввод / вывод (IO) с вашего жесткого диска занимает значительное количество времени, поэтому процессор ждет значительное количество времени, прежде чем он сможет работать с изображениями в UniqPicture
.Если бы вы могли предварительно загрузить изображения в память, я бы подумал, что загрузка ЦП будет намного выше, если не увеличить ваш ЦП.
В произвольном порядке, вот некоторые мысли
- Что произойдет, если вы запустите это последовательно?Это позволит максимально использовать одно ядро процессора, но это может предотвратить перегрузку жесткого диска.Если было запущено 100 потоков, это означает, что на жесткий диск приходится много запросов одновременно.
Вы можете добавить эту опцию, чтобы она запускалась последовательно (или простоэто обычный цикл без Parallel.
):
new ParallelOptions { MaxDegreeOfParallelism = 1 },
Возможно, попробуйте 2, 3 или 4 потока и посмотрите, не изменится ли что-либо.
- Проверьтеиспользование вашего жесткого диска в диспетчере задач.Какова задержка на жестком диске, где хранятся изображения?Какой процент, который Winows сообщает, что он занят?Вы хотите, чтобы жесткий диск был занят все время (100% использования), но вы также хотите, чтобы он захватывал ваши изображения с максимально возможной пропускной способностью, чтобы процессор мог выполнять свою работу.
- Вращающийся жесткий диск(HDD) имеет гораздо более низкие IOPS (IO в секунду), чем SSD в целом.У SSD обычно будет 1000-10000+ операций ввода-вывода в секунду, но, как я полагаю, у жесткого диска около 200, а пропускная способность обычно намного ниже.Твердотельный накопитель должен помочь вашей программе использовать процессор гораздо больше.
- Размер файлов изображений может оказать здесь влияние, опять же, относящийся к IO.
- Или, может быть, увидеть Роберт Макки ответ о том, что ваши темы становятся узкими.Может быть, лучшее использование процессора - 13%.Максимальное число ядер составляет 1/6 (ваш процессор имеет 6 ядер), что составляет ~ 16,7%, так что вы уже не так уж далеки от того, чтобы максимально использовать одно ядро.
- В конечном счете, сколько времени это займет.Загрузка ЦП должна масштабироваться обратно линейно (более высокая загрузка ЦП = меньшее время работы) со временем, которое требуется для запуска, но это время, чтобы быть уверенным, поскольку это реальный тест.