Подтвердить что ты не робот

Служба 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, бесшумно потребляющий ценные циклы процессора.

4b9b3361

Ответ 1

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

Сборщик мусора имеет три режима: рабочую станцию, серверную и параллельную. Каждый ведет себя по-другому и оптимизирован для разных типов приложений. Режим рабочей станции - это режим по умолчанию, и все процессы запускаются, если не настроено на использование чего-то другого. Подробнее о режимах можно найти здесь.

Попробуйте явно настроить сборщик мусора на использование режима сервера (это будет влиять только на многопроцессорную машину). Для этого добавьте в файл app.config следующее:

<configuration>
    <runtime>
        <gcServer enabled="true" />
    </runtime>
</configuration>