Анализ производительности ADO.NET и Entity Framework
Какой из них дает лучшую производительность? ADO.NET или Entity Framework.
Это два метода, которые я хочу проанализировать.
Метод тестирования ADO.NET
public void ADOTest()
{
Stopwatch stopwatch = Stopwatch.StartNew();
using (SqlConnection con = new SqlConnection(connection))
{
string Query = "select * from Product ";
SqlDataAdapter da = new SqlDataAdapter(Query, con);
DataSet ds = new DataSet();
con.Open();
da.Fill(ds);
DataView dv = ds.Tables[0].DefaultView;
}
stopwatch.Stop();
Console.WriteLine("ADO.NET Time Elapsed={0}", stopwatch.Elapsed);
}
Метод проверки платформы Entity Framework
public void EFTest()
{
Stopwatch stopwatch = Stopwatch.StartNew();
var list = _OnlineStoreEntities.Products.ToList();
stopwatch.Stop();
Console.WriteLine("Entity Framework Elapsed={0}", stopwatch.Elapsed);
}
Результат при первом выполнении
Когда я использовал этот метод выше более чем в 100 раз. Среднее время выполнения показано на изображении:
![first result]()
ADO.NET заняло всего 2 миллисекунды, если Entity Framework заняла более 4 миллисекунд.
Результат во втором исполнении
Когда я запускал этот метод снова и снова за один проход. Среднее время выполнения между ADO.NET и EF не намного больше:
![second result]()
Вопрос
- Я думаю, что EF дает очень худшую производительность при первом запуске. Тогда почему мы используем EF?
- Почему второе исполнение EF было быстрее, чем выполнение в первый раз?
Ответы
Ответ 1
- Впервые EF загружает метаданные в память, это занимает некоторое время. Он строит представление модели в памяти в виде файла edmx или из исходного кода, если вы сначала используете код. На самом деле EF построен в верхней части ADO.NET, поэтому он не может быть быстрее. Но это делает развитие намного быстрее. И улучшает ремонтопригодность вашего кода.
- См. 1
Взгляните на статью msdn Рекомендации по производительности (Entity Framework)
Ответ 2
- 1) При работе с базами данных EF делает многое более комфортным. Многое происходит под капотом, который вам в противном случае пришлось бы закодировать вручную.
Например, один из моих первых больших проектов много работал с данными, и я реализовал уровень доступа с ADO.NET. Это составило примерно четверть или даже третья часть всего проекта.
С моим опытом EF сегодня я мог бы избавиться почти от всего этого!
Я просто делаю много сложного кода, который я написал вручную, совершенно ненужным. Мы говорим о тысячах линий здесь.
- 2) Здесь есть две основные причины. Во-первых, EF построен поверх ADO.NET. Это означает, что когда-либо EF делает, добавляет больше накладных расходов на то, что сделает ADO. Второй (очень) простой, компилятор JIT компилирует код в первый раз, только когда он выполняется. Это включает в себя выделение памяти и всевозможные инициализации.
Это означает, что код, который вы запускаете несколько раз, выполняется намного быстрее со второго раза. Если вы выполняете свои EF-запросы только один раз, с другой стороны, у вас не будет никакой выгоды от этих инициализаций.
В реальном приложении вы можете попытаться сделать некоторые оптимизации, например, используя Скомпилированные запросы. Производительность мудрая, это очень поможет вам, потому что теперь ваши запросы не обязательно должны быть подготовлены и скомпилированы при каждом запуске, но только один раз.
Ответ 3
Во время работы в Microsoft я написал сообщение в блоге, сравнивающее производительность обоих. Похоже, что сейчас он находится в процессе миграции, поэтому вам может потребоваться перейти в интернет-архив, чтобы найти его...
Мы сосредоточились на том, чтобы убедиться, что стоимость использования EF не была ужасной, не идеальной в V1, но вполне пригодной для использования.
Хотя почти 10 лет спустя команда EF сделала хорошую работу, улучшив производительность, в частности, уменьшив сценарии плохого случая, по дизайну Entity Framework сидит над ADO.Net. Поэтому, если ваши основные критерии - это сырая производительность, вы должны пойти на ADO.Net с ручным оптимизированным SQL.
Если говорить, что многие в противном случае хорошие разработчики, не создавайте лучший SQL; Entity Framework изолирует их от написания запросов и использует хорошие методы для создания разумно хороших запросов.
Основным преимуществом Entity Framework является предоставление более высокого уровня абстракции для работы с данными, выделение разработчика приложения из базовой модели данных. Таким образом, вы должны использовать EF, чтобы быть более продуктивным, записывая меньше кода доступа к данным; вы по-прежнему можете точно настраивать конкретные запросы или операции с данными, не теряя абстракции, которая упрощает программирование для кода, не относящегося к производительности, который является наибольшей частью любого бизнес-приложения, например.