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