Мое приложение .NET Framework 4.0 использует Crystal Reports для .NET. В одной производственной среде у меня возникают проблемы с медленной загрузкой отчетов. Когда приложение работает, отчеты загружаются как любая другая установка, но через несколько дней они замедляются. Примерно через неделю загрузка занимает около 10 секунд дольше, чем следует. После некоторых исследований я взял образец с ProcessMonitor, и он показывает, что проблема заключается в чтении реестра. Когда Crystal Reports загружается, он читает HKEY_CLASSES_ROOT (или HKCR), чтобы получить все расширения файлов. Эта часть намного медленнее, когда приложение работает в течение недели, чем сразу после запуска. У меня есть 2 скриншота, чтобы показать вам разницу.
На приведенном ниже снимке экрана показан снимок прочитанного. Время суток в этом блоке говорит мне, что чтение всех этих строк заняло ~ 30,14 миллисекунды. Звучит не очень плохо, но давайте посмотрим на следующий скриншот.
Это скриншот сразу после перезапуска приложения. Никакой перезагрузки системы не происходит! Только само приложение было закрыто и запущено заново. Чтение всех этих строк заняло ~ 0,42 миллисекунды. В 70 раз быстрее!
На скриншотах показано только 27 строк чтения. Фактическое число операций чтения превышает 9000. Вот почему мое приложение заняло на 10 секунд больше среднего времени.
Хорошо упомянуть, что, хотя эта проблема возникает, пики ЦП в 1 или 2 потоках. Я не нашел никаких доказательств утечки памяти. Возможно, проблема в том, что Crystal Reports что-то делает со считываемыми данными, но это не отображается в ProcessMonitor.
Так что здесь происходит? Является ли реестр источником проблемы или Crystal Reports что-то делает не так?