Подтвердить что ты не робот

Анализ производительности 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 было быстрее, чем выполнение в первый раз?
4b9b3361

Ответ 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, чтобы быть более продуктивным, записывая меньше кода доступа к данным; вы по-прежнему можете точно настраивать конкретные запросы или операции с данными, не теряя абстракции, которая упрощает программирование для кода, не относящегося к производительности, который является наибольшей частью любого бизнес-приложения, например.