Я новичок в службах данных 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 Data Services (ObjectContext).
Результаты:
- 25 итераций собственного SQL: 436 мс
- 25 итераций Entity Framework: 656 мс
- 25 итераций WCF Data Services: 12110 мс
Ой. Это примерно в 20 раз медленнее, чем EF.
Поскольку WCF Data Services - это HTTP, нет возможности для повторного использования HTTP-соединения, поэтому клиент вынужден повторно подключаться к веб-серверу для каждой итерации. Но, конечно, здесь происходит нечто большее.
Сам EF работает довольно быстро, и один и тот же код / модель EF повторно используется как для тестирования службы, так и для клиентских тестов прямого подключения к EF. В службе данных будут накладные расходы на сериализацию и десериализацию Xml, но это так!?! В прошлом у меня была хорошая производительность с сериализацией Xml.
Я собираюсь провести несколько тестов с кодировками JSON и Protocol-Buffer, чтобы увидеть, смогу ли я повысить производительность, но мне любопытно, есть ли у сообщества какие-либо советы по ускорению этого процесса.
Я не силен в IIS, поэтому, возможно, есть некоторые настройки IIS (кеши, пулы соединений и т. Д.), Которые могут улучшить это?