Почему многопоточность в C # не достигает 100% CPU? - PullRequest
28 голосов
/ 05 ноября 2008

Я работаю над программой, которая обрабатывает много запросов, ни один из которых не достигает более 50% процессорного времени ( в настоящее время я работаю над двухъядерным ). Поэтому я создал поток для каждого запроса, весь процесс проходит быстрее. Обрабатывая 9 запросов, один поток длится 02 мин 08 с, а при одновременной работе 3 потоков время сокращается до 01 мин 37 с, но при этом он не использует 100% ЦП, только около 50%.

Как я могу позволить моей программе использовать все возможности процессоров?

EDIT Приложение не ограничено вводом-выводом или памятью, оно постоянно находится на разумном уровне.

Я думаю, что это как-то связано с «двойным ядром».

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

Более дорогостоящая часть моего кода - это вызов dll через COM (из всех потоков вызывается один и тот же внешний метод). Эта dll также не ограничена ни памятью, ни вводом-выводом, это компонент распознавания AI, я делаю OCR-распознавание зарплаты, зарплаты для запроса.

EDIT2

Весьма вероятно, что метод STA COM является моей проблемой. Я связался с владельцами компонентов, чтобы решить эту проблему.

Ответы [ 13 ]

0 голосов
/ 05 ноября 2008

Это на самом деле не ответ, но вы проверили perfmon, чтобы увидеть, какие ресурсы он использует, и запустили ли профилировщики в коде, чтобы увидеть, где он проводит время?

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

Можете ли вы дать краткое описание того, что делают потоки?

0 голосов
/ 05 ноября 2008

Вы уверены, что ваши задачи требуют интенсивной работы процессора? Есть ли обработка ввода-вывода? Это может быть причиной вашей 50% нагрузки.

Тест: Попробуйте использовать только 2 потока и установить сродство каждого потока для каждого ядра. Затем откройте диспетчер задач и наблюдайте за загрузкой обоих ядер.

0 голосов
/ 05 ноября 2008

Похоже, что производительность вашего приложения может не зависеть от количества доступных ресурсов процессора. Если вы обрабатываете запросы по сети, процессор (ы) может ожидать поступления данных или сетевого устройства для передачи данных. В качестве альтернативы, если вам нужно найти данные для выполнения запроса, процессор может ожидать диск.

...