Почему мой код не использует доступные циклы процессора? - PullRequest
0 голосов
/ 24 августа 2010

Я написал плагин для ESRI ArcEditor, который выполняет некоторые проверки правильности в дорожной сети. Чтобы проверить, все ли правила соблюдаются, в основном выполняется целая куча различных пересечений, с некоторыми буферизацией и конвертами и т. Д. На выбранных объектах.

Это было написано на C #.

Теперь, что я замечаю, так это то, что для выполнения заданных алгоритмов на выбранных функциях действительно требуется много времени. Я загрузил профилировщик ANTS и оптимизировал узкие места, пока больше ничего не могу сделать.

Странная вещь, которую я заметил, заключается в том, что ANTS практически не сообщала об использовании процессора на временной шкале - плоская линия. Затем я проверил, что процессор остается ниже примерно 10-15% с помощью диспетчера задач, когда выполняется операция проверки. Это не имеет смысла для меня. Почему он не использует доступные циклы процессора?

Не происходит ввода-вывода, поскольку он загружает все из ArcSDE. Я также проверил, что во время процесса валидации нет заметного сетевого трафика, полагая, что он, возможно, ожидал комманд между ArcEditor и сервером. Затем я проверил процессоры на сервере, чтобы удостовериться, что ему не была делегирована никакая обработка, но его использование ЦП оставалось стабильным на 1% во время процесса проверки.

Тогда я подумал, что ArcEditor, возможно, подавляет приоритет, с которым могут работать его плагины, или что-то в этом роде. Поэтому я включил математическую операцию, которая бы максимально загружала процессор примерно на 10 секунд, вместо процедуры проверки, и он сделал именно это. Загрузка процессора была стабильной - чуть более 50%, что имеет смысл, так как математическая операция максимально использовала бы одно из ядер моего Core 2 Duo. Так что не повезло. И доступно более 1 ГБ ОЗУ.

Наконец, я пытался найти проблему с perfmon, но мне не повезло. У меня не было большого опыта с этим, но не могу найти ничего плохого.

Это из-за интерфейса ArcObjects COM? Хотя я также проверил счетчики .NET Interop с perfmon.

Я в растерянности.

Так что любая помощь или советы будут с благодарностью.

1 Ответ

1 голос
/ 26 августа 2010

Может быть проблема с многопоточностью. COM будет автоматически маршалировать вызовы методов в интерфейсе COM в соответствующий поток. Который обычно является потоком пользовательского интерфейса программы. Это очень медленно, так как для этого требуется переключение контекста потока, а поток пользовательского интерфейса должен находиться в состоянии для отправки вызова. Сгорело несколько циклов ЦП, все блокируется до завершения вызова.

Используйте объект COM в том же потоке, в котором он был создан. Какой должен быть поток пользовательского интерфейса, если этот объект имеет требования STA. Они обычно делают.

...