2016-08-26 4 views
4

У меня есть огромное приложение, которое использует Entity Framework 4. Это WCF на сервере (размещенный внутри службы Windows) и WPF на клиенте.
Некоторые из его деталей медленны, и мне интересно, связано ли это с тем, что доступ к базе данных медленный.
Я хотел бы постоянно измерять производительность этого кода, например. регистрировать время выполнения каждого запроса (предпочтительно , включая собственные материалы EF, такие как материализация), где-то анализировать позже. Как мне это сделать?
инструменты, как ЭфПрофы (потому что даже если они могут измерять время потребовалось дб сервера для выполнения конкретного запроса, как я запускать их в течение недели?) и Glimpse (он не поддерживает службу Windows, и WPF) не будет делать в моем случае.
Я рассмотрел возможность создания собственного подкласса SqlConnection, но моя версия принимает EntityConnection в ObjectContext ctor, а EntityConnection отмечена как запечатанная. И этот параметр позволит измерять необработанные запросы на выполнение sql-запросов, а не код EF.
Единственные опции, которые я вижу сейчас: 1) обновить до EF 6 и написать подкласс SqlConnection (это не будет определять собственный код EF); 2) обновить до более поздних версий и использовать что-то вроде EF hooks library
И, конечно же, это не в книге (просто посмотрел на Mastering Enity Framework) - потому что большинству из нас нужно только работать с библиотекой, не знаю, как быстро это (сарказм).Как непрерывно измерять производительность EF?

+0

Чтобы просмотреть выполненные журналы запросов, вам не нужно писать подкласс SqlConnection, поэтому достаточно установить 'context.Database.Log = Console.WriteLine;'. Просто замените 'Console.WriteLine' своим собственным действием в журнале. Но, как вы сказали, это может позволить вам измерять время выполнения запроса, а не код EF. –

+0

Почему бы не профилировать базу данных? Если вы видите запросы с высоким уровнем ввода-вывода или длительностью, то настройте их, либо настроив объекты БД (например, индексы), либо найдя инструкцию EF и настроив ее. – Igor

+0

@ Сама база данных Igor не может быть проблемой – chester89

ответ

1

Там все виды оптимизации делаются, как кэширование выражения LINQ и что сервер SQL выбирает для кэширования, единственный способ измерить вашу скорость работы и потребление памяти

для Вашего случая, я думаю, что Microsoft предоставил простой способ: «Measuring Entity Framework Performance using ETW»

Кроме того, вы можете получить эту информацию через профайлер SQL, это намного больше.

+0

, вы забыли упомянуть, что для обновления требуется EF 6.тем не менее, это похоже на хороший вариант. – chester89

+0

Надеюсь, это помогло, и голосование было бы здорово здесь :) – MohamedHamza