Как определить, находится ли EF в состоянии холодного или теплого выполнения?

#c# #entity-framework #performance-testing

#c# #entity-framework #тестирование производительности

Вопрос:

Я пытаюсь измерить производительность с помощью Stowpatch класса, включая операции с базой данных, но, насколько я понимаю, производительность EF также зависит от состояний холодного и теплого выполнения.

Я хотел бы отметить в журнале производительности, что определенный вывод является результатом того, в каком состоянии EF находился в то время.

Есть ли событие жизненного цикла, к которому я мог бы подключиться или что-то в этом роде?

Ответ №1:

Я надеюсь, что entity framework profiler — это тот инструмент, который вам нужен.

Комментарии:

1. Вероятно, нет, потому что я не понимаю, как это будет вписываться в существующую настройку профилирования. И меня больше интересует ответ на мой вопрос. Плюс это стоит денег.

Ответ №2:

Нет события жизненного цикла или чего-либо, к чему вы могли бы подключиться, чтобы определить холодное или теплое выполнение запроса. Согласно соображениям производительности для Entity Framework 4, 5 и 6:

В самый первый раз, когда какой-либо запрос выполняется к данной модели, Entity Framework выполняет большую работу за кулисами для загрузки и проверки модели. Мы часто называем этот первый запрос «холодным» запросом. Дальнейшие запросы к уже загруженной модели известны как «теплые» запросы и выполняются намного быстрее.

Итак, если вы хотите измерить производительность при холодных и теплых запросах, выполните свои запросы дважды и используйте System.Diagnostics.Stopwatch для определения времени, прошедшего для первого и последующего выполнения ваших запросов.

Первое выполнение запроса — холодный запрос

 Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
using(var db = new MyContext())
{
    var q1 = from c in db.Customers where c.Id == 1 select c;
    var c1 = q1.First();
}
stopWatch.Stop();
TimeSpan coldts = stopWatch.Elapsed;
  

Второе выполнение запроса — теплый запрос

 Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
using(var db = new MyContext())
{
    var q1 = from c in db.Customers where c.Id == 1 select c;
    var c1 = q1.First();
}
stopWatch.Stop();
TimeSpan warmts = stopWatch.Elapsed;