2012-04-14 3 views
0

Мое многопоточное приложение принимает некоторые файлы из HD и затем обрабатывает данные в этих файлах. Я повторно использую тот же экземпляр класса (dataProcessing)) для создания потоков (я просто изменяю параметры вызывающего метода).Многопоточное приложение не достигает 100% использования процессора

processingThread [i] = new Thread (новый ThreadStart (dataProcessing.parseAll));

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

Для обработки каждого файла требуется около полуминутки. Файлы быстро читаются, так как они всего 200 КБ. После обработки файлов я пишу все результаты в одном файле назначения. Я не думаю, что проблема заключается в чтении или записи на диск. Все потоки работают над задачей, но по какой-то причине процессор не используется полностью. Я пытаюсь добавить больше потоков, чтобы узнать, могу ли я достичь 100% использования процессора, но он доходит до точки, где он замедляется и уменьшает использование обработки, а не полностью ее использует. У кого-нибудь есть идея, что может быть неправильным?

+0

Как насчет этого процесса заставляет думать, что узкие места являются процессором? – yamen

+0

Ну, когда я отлаживал приложение, я вижу, что все потоки «что-то делают». Фактически, я получаю некоторое время, используя больше потоков, но если я добавлю слишком много, производительность снижается. – Devela

+0

Я думаю, нужна дополнительная информация. Все эти задачи записываются в тот же файл, что может быть узким местом. 30 секунд для обработки 200 Кбайт данных предлагает нечто иное, чем связанные с CPU процессы ... – yamen

ответ

0

Вот некоторые моменты, вы можете рассмотреть:

  1. большинство процессоров сегодня является Hyper резьбы. Несмотря на то, что ОС предполагает, что каждое гиперячеевое ядро ​​имеет 2 линии трубопроводов, это не так и сильно зависит от процессора и выполняемых арифметических операций. В то время как на большинстве ЦП есть две целые единицы на каждой линии трубопровода, существует только одна FP, поэтому большинство операций FP не набирают каких-либо подобий из гиперпотоковой архитектуры.

  2. Поскольку файл всего 200 тыс., Я могу только предположить, что он все скопирован в кэш, так что это не проблема с памятью/диском.

  3. Вы используете внешние DLL-файлы? некоторые операции, такие как чтение/сохранение файлов JPEG с использованием собственного класса Bitmap, не параллельны, и вы не увидите ускорения, если вы выполняете несколько исполнений сразу.

  4. Снижение производительности, когда вы достигаете точки, в которой переключение между потоками стоит больше, чем операция, которую они выполняют.

  5. Вы только читаете данные, или вы также изменяете его? Если каждый поток также изменяет данные, то в кеше много блокировок. Было бы лучше, чтобы каждый поток собирал свои собственные данные в своей собственной памяти и объединять все данные вместе только после того, как все потоки выполняют свою работу.

+0

Операции, которые я выполняю, не являются арифметическими действиями. Я убедился, что это не узкое место на диске, поскольку для меня требуется меньше времени, чтобы просто открывать, читать и закрывать файлы. Да, я использую внешнюю DLL, но у меня есть несколько экземпляров HtmlAgilityPack HtmlDocument, по одному для каждого потока. Однако все они имеют структуру данных (только для чтения). – Devela

+0

Я забыл пометить вас в предыдущем сообщении, какие-нибудь идеи? – Devela

+0

Есть ли точка, в которой потоки используют блокировку, например, при чтении общей структуры данных? – IvoTops

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