Профилирование / оптимизация многопоточного приложения

Я пишу критически важное для производительности приложение .NET, которое интенсивно использует многопоточность.

При использовании профилировщика производительности Visual Studio основными функциями с эксклюзивными примерами являются:

WaitHandle.WaitAny () - 14,23%

@ JIT_MonReliableEnter @ 8 - 7,76%

Монитор. Введите - 5,09%

В основном, мои 3 основные функции работают с примитивами многопоточности и, как мне кажется, в некоторой степени находятся вне моего контроля. По сравнению с ними мои процедуры работы / обработки довольно малы, и я пытаюсь повысить производительность. Я считаю, что задействованные алгоритмы довольно надежны, хотя я довольно часто их пересматриваю.

У меня следующие вопросы:

  • Если в этих методах используется 14,23% выборок ЦП - действительно ли ЦП «простаивает» для большинства этих выборок, т.е. просто ожидает других потоков? Или неактивная часть ожиданий потоков не отображается как часть трассировки профиля [и 27.08% показано в этих 3 суммах всех накладных расходов в этих методах синхронизации]? (Я могу предположить, что это в основном простаивает, но я был бы признателен за некоторые приличные справочные материалы для ответов на этот, пожалуйста)
  • Я просмотрел свои схемы блокировки, однако эти результаты указывают на какое-то конкретное узкое место или метод, который я должен изучить для дальнейшего оптимизация?
  • Является ли WaitAny особенно плохим? Я часто использую его, чтобы проверить, доступны ли определенные объекты очереди для чтения / записи, а также одновременно проверяю флаг прерывания. Есть ли лучший способ сделать это?
7
задан Kieren Johnstone 7 November 2011 в 23:20
поделиться