Сравнение производительности Linq to SQL и ADO.Net

Linq to SQL преобразует Linq запросы из объектной модели в SQL и отправляет их на выполнение в базу данных. Результат запроса преобразуется обратно в объекты.

Технология ADO.Net в отличие от Linq To Sql позволяет выполнять запросы на языке SQL, а возвращает результат в виде объекта DataSet.

Для сравнения производительности двух технологий воспользуемся двумя классами.
  • Класс для работы с БД с помощью Ado.Net:
class ADOSpeed {
        
        SqlConnection _connection;

        /// <summary>
        /// Подключается к БД по имени компьютера и имени БД
        /// </summary>
        /// <param name="compName">Имя компьютера</param>
        /// <param name="dataBase">Имя базы данных</param>
        public ADOSpeed(string compName, string dataBase) {
            _connection = new SqlConnection(@"Data Source=" + compName + ";Initial Catalog=" + dataBase + ";Integrated Security=True");
            _connection.Open();
        }

        /// <summary>
        /// Закрытие соединения
	  /// </summary>
        public void CloseConnection() {
            _connection.Close();
        }

        /// <summary>
        /// Выполнение SQL запроса
	  /// </summary>
        /// <param name="sqlCode">текст SQL запроса</param>
        public void runQuery(string sqlCode)
        {
            SqlCommand cmd = _connection.CreateCommand();
            cmd.CommandText = sqlCode;
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    var x = reader;
                }
            }
        }
}
  • Класс для работы с БД с помощью Linq To Sql:
class LinqDBSpeed {
        
        DataContext _dataBase;

        /// <summary>
        /// Подключается к БД по имени компьютера и имени БД
	  /// </summary>
        /// <param name="compName">Имя компьютера</param>
        /// <param name="dataBase">Имя БД</param>
        public LinqDBSpeed(string compName, string dataBase) {
            _dataBase = new DataContext("Data Source=" + compName + ";Initial Catalog=" + dataBase + ";Integrated Security=True");
        }

        /// <summary>
        /// Выбирает все записи из таблицы, удовлетворяющие условию
        /// </summary>
        public void SelectSpeed() {
            var numbers = _dataBase.GetTable<Numbers>();
            var query = from line in numbers where line.sqrt > 9 && 
				line.sqrt < 20 select line;
            foreach (var line in query) {
                var x = line;
            }
        }

        /// <summary>
        /// Сортирует все записи по значению столбца sqrt
        /// </summary>
        public void SortingSpeed()
        {
            var numbers = _dataBase.GetTable<Numbers>();
            var query = from line in numbers orderby line.sqrt select line;
            foreach (var line in query)
            {
                var x = line;
            }
        }
    }

Тест производительности Ado.Net:
static void ADOTest(int testCount) 
        {
            long mem = System.GC.GetTotalMemory(false);
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < testCount; i++)
            {
                ADOSpeed test = new ADOSpeed(@"ANTON-LAPTOP\ANTON", "myDB");
                test.runQuery("SELECT * FROM numbers ORDER BY sqrt");
                test.runQuery("SELECT * FROM numbers WHERE sqrt>9 AND sqrt<20");
                test.CloseConnection();
            }
            Console.WriteLine("ADO time: {0}ms", sw.ElapsedMilliseconds);

            mem = System.GC.GetTotalMemory(false) - mem;
            Console.WriteLine("ADO memory: {0}bytes", mem);
        }

Тест производительности Linq To Sql:
static void LinqTest(int testCount)
        {
            long mem = System.GC.GetTotalMemory(false);
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < testCount; i++)
            {
                LinqDBSpeed test2 = new LinqDBSpeed(@"ANTON-LAPTOP\ANTON", "myDB");
                test2.SelectSpeed();
                test2.SortingSpeed();
            }

            Console.WriteLine("Linq time: {0}ms", sw.ElapsedMilliseconds);
            mem = System.GC.GetTotalMemory(false) - mem;
            Console.WriteLine("Linq memory: {0}bytes", mem);
        }	

Результаты сравнения производительности

  • Сравнение Linq To Sql и Ado.Net по времени исполнения
LinqVsAdo1.png
  • Сравнение Linq To Sql и Ado.Net по количеству используемой памяти
LinqVsAdo2.png
--
автор: Лисицын Антон

Last edited Jan 27, 2012 at 4:41 AM by basph, version 7

Comments

No comments yet.