Служба WCF, размещенная в Windows Service, работает в 10 раз медленнее консольного приложения
У меня есть библиотека С#, которая обрабатывает некоторые файлы. Я создал консольное и настольное приложение, которое использует библиотеку и обрабатывает 256-мегабайтный файл примерно за 1 минуту. Затем я создал службу WCF, размещенную в службе Windows, которая использует одну и ту же библиотеку обработки файлов, но занимает 10 раз дольше, чтобы обрабатывать один и тот же файл 256mb при вызове с веб-сайта. Служба Windows работает под учетной записью домена с правами администратора.
Накладные расходы при вызове службы WCF очень быстры, но метод LoadFile занимает гораздо больше времени. Я попытался увеличить приоритет процесса во время запуска через
Process.GetCurrentProcess ().PriorityClass = ProcessPriorityClass.High;
безрезультатно. Я запустил эту службу на 64-битной настольной системе Win7 (6 Гб), 2003 XP 32bit server (4gb) и 32-битном сервере R2 R2 (4bg) с одинаковыми результатами. Консольные и настольные приложения обрабатывают файл примерно за 1 минуту в указанной выше системе. Процесс, похоже, не ограничен памятью и входит в swapville.
Службы Windows каким-то образом связаны с процессом? Получаю ли я лучшие результаты работы службы WCF в IIS?
EDIT: Я попытался вызвать библиотечный каталог с веб-сайта, и это тоже занимает 10 раз больше, чем консольное или настольное приложение.
ОБНОВЛЕНИЕ: Оказывается, это был Log4PostSharp. Консольные и настольные приложения не имели никаких следов log4net в конфигурационных файлах, но веб-сайт и служба Windows. Был log4net TraceAppender, бесшумно потребляющий ценные циклы процессора.
Ответы
Ответ 1
Я не могу понять, почему поведение, которое вы описываете, происходит - это кажется очень странным. Так как вы обрабатываете относительно большой файл в памяти, хотя сборщик мусора может повлиять на него. Вы можете попробовать изменить режим работы сборщика мусора, чтобы узнать, имеет ли он эффект.
Сборщик мусора имеет три режима: рабочую станцию, серверную и параллельную. Каждый ведет себя по-другому и оптимизирован для разных типов приложений. Режим рабочей станции - это режим по умолчанию, и все процессы запускаются, если не настроено на использование чего-то другого. Подробнее о режимах можно найти здесь.
Попробуйте явно настроить сборщик мусора на использование режима сервера (это будет влиять только на многопроцессорную машину). Для этого добавьте в файл app.config
следующее:
<configuration>
<runtime>
<gcServer enabled="true" />
</runtime>
</configuration>