Анализ производительности 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 раз. Среднее время выполнения показано на изображении:

первый результат

ADO.NET заняло всего 2 миллисекунды, если Entity Framework заняла более 4 миллисекунд.

Результат во втором исполнении

Когда я запускал этот метод снова и снова за один проход. Среднее время выполнения между ADO.NET и EF не намного больше:

второй результат

Вопрос

  1. Я думаю, что EF дает очень худшую производительность при первом запуске. Тогда почему мы используем EF?
  2. Почему второе исполнение EF было быстрее, чем при первом запуске?

  1. Впервые EF загружает метаданные в память, это занимает некоторое время. Он строит представление модели в памяти в виде файла edmx или из исходного кода, если вы сначала используете код. На самом деле EF построен в верхней части ADO.NET, поэтому он не может быть быстрее. Но это делает развитие намного быстрее. И улучшает ремонтопригодность вашего кода.
  2. См. 1

Взгляните на статью msdn Вопросы производительности (Entity Framework)

  • 1) EF делает многое более удобным при работе с базами данных. Вдоль капота много происходит, и вам придется вручную вводить код.

Например, один из моих первых крупных проектов много работал с данными, и я реализовал уровень доступа с ADO.NET. Это составило примерно четверть или даже треть всего проекта.

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

  • 2) Здесь есть две основные причины. Во-первых, EF построен поверх ADO.NET. Это означает, что когда-либо EF делает, добавляет больше накладных расходов на то, что сделает ADO. Второй (очень) простой, компилятор JIT компилирует код в первый раз, только когда он выполняется. Это включает в себя выделение памяти и всевозможные инициализации.

Это означает, что код, который вы запускаете несколько раз, выполняется намного быстрее со второго раза. С другой стороны, если вы выполняете ваши запросы EF, у вас не будет никакой выгоды от этих инициализаций.

В приложении реального мира вы можете попытаться сделать некоторые оптимизации, например, с помощью скомпилированных запросов . Производительность мудрый это поможет вам много, потому что теперь ваши запросы не нужно готовить и компилировать каждый раз, когда вы запускаете их, но только один раз.

Во время работы в Microsoft я написал сообщение в блоге, сравнивающее производительность обоих. Кажется, что сейчас он находится в процессе миграции, поэтому вам может потребоваться перейти в интернет-архив, чтобы найти его …

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

Хотя почти 10 лет спустя команда EF добилась хорошей работы, улучшая производительность, особенно уменьшая сценарии плохого случая, по дизайну Entity Framework сидит над ADO.Net. Поэтому, если ваши основные критерии – это сырая производительность, вы должны пойти на ADO.Net с ручным оптимизированным SQL.

При этом многие другие хорошие разработчики не создают лучший SQL; Entity Framework изолирует их от написания запросов и использует хорошие методы для создания разумно хороших запросов.

Основным преимуществом платформы Entity Framework является предоставление более высокого уровня абстракции для работы с данными, выделение разработчика приложения из базовой модели данных. Таким образом, вы должны использовать EF, чтобы быть более продуктивным, записывая меньше кода доступа к данным; вы по-прежнему можете точно настраивать конкретные запросы или операции с данными, не теряя абстракции, что упрощает программирование для кода, не относящегося к производительности, который является, например, самой большой частью любого бизнес-приложения.