Я новичок в службах передачи данных WCF, поэтому я играл. После некоторых начальных тестов я разочарован результатами работы службы тестовых данных.Как улучшить производительность служб данных WCF
Я понимаю, что, поскольку WCF DS является HTTP на основе есть накладные расходы, присущие протоколу, но мои тесты все еще гораздо медленнее, чем хотелось бы ожидать:
Окружающая среда:
- Все на одной коробке : Четырехъядерный 64-разрядный ноутбук с 4 ГБ оперативной памяти, работающий на W7. Достойная машина.
- Малая база данных SQL (SQLExpress 2008 R2) с 16 таблицами ... в тестовой таблице содержится 243 строки.
- Размещено мое тестовое обслуживание в IIS со всеми значениями по умолчанию.
Код:
- Я создал Entity Framework модель (DataContext) для этой базы данных (складочном Codegen по VS2010).
- Я создал службу данных на основе этой модели.
- Я создал клиента, который имеет прямую ссылку на службу (ObjectContext) для этой услуги (фондовый код от VS2010)
- В клиенте я также могу вызвать модель EF напрямую, а также использовать собственный SQL (ADO .NET SqlConnection)
План тестирование:
- Каждая итерация соединяется с базой данных (есть возможность повторно использовать соединение), запросы для всех строк в целевой таблице («СОБЫТИЕ»), а затем подсчитывает их (таким образом, заставляя любые отложенные выборки выполняться).
- Запуск для 25 итераций каждый для собственного SQL (SqlConnection/SqlCommand), Entity Framework (DataContext) и служб данных WCF (ObjectContext).
Результаты:
- 25 итераций Native SQL: 436ms
- 25 итераций Entity Framework: 656ms
- 25 итераций Службы данных WCF: 12110ms
Ouch. Это примерно в 20 раз медленнее, чем EF.
Поскольку службы WCF Data Services являются HTTP, нет возможности повторного использования HTTP-соединений, поэтому клиент вынужден повторно подключаться к веб-серверу для каждой итерации. Но, конечно, здесь происходит нечто большее.
EF сам по себе довольно быстр, и это один и тот же код/модель EF повторно используется как для службы, так и для клиентских тестов прямого доступа к EF. Там будут некоторые накладные расходы для Xml-сериализации и десериализации в службе данных, но это многое!?! В прошлом у меня была хорошая производительность с сериализацией Xml.
Я собираюсь запустить некоторые тесты с кодировками JSON и Protocol-Buffer, чтобы узнать, могу ли я повысить производительность, но мне любопытно, есть ли у сообщества какие-либо советы для ускорения этого.
Я не силен с IIS, поэтому, возможно, есть некоторые настройки IIS (кэши, пулы соединений и т. Д.), Которые можно настроить для улучшения этого?
... Интересный ряд мнений, несколько повышающих голосов, и пара любимыха добавляет, но нет ответов. Я открываю щедрость, чтобы вдохнуть еще одну жизнь в этот вопрос. Надеюсь, у кого-то есть ответ. –
Я бы не использовал службы данных WCF, если бы я не планировал подвергать свои данные другим приложениям. Если все работает в одной коробке, почему бы просто не использовать EF напрямую? –
Он не работает на одной коробке. Но источники данных все находятся в (очень большой и международной) корпоративной сети. Я пытаюсь поставить слой обслуживания перед кучей разных источников данных (SQL, XML, плоские файлы и т. Д.), Который изолирует семантику фактической памяти от возможности обнаруживать и запрашивать данные. –