Производительность Entity Framework
От: Степанов Андрей  
Дата: 06.03.12 16:19
Оценка: 2 (1)
Добрый день!
Подумываю над тем, чтобы опробовать какой-нибудь ORM в своем проекте. Реальной необходимости пока не вижу, прекрасно обхожусь запросами к БД, но может быть я слеп, надо изучить область
Так вот решил попробовать Entity Framework. На текущий момент приложению приходится выполнять довольно много мелких запросов (например, по первичному ключу), поэтому я решил проверить скорость выборки данных EF. Вот тестовый код, который сравнивает прямую выборку из БД через ADO.NET и через EF:

// ADO.NET
SqlConnection cnn = new SqlConnection ( @"Data Source=someserver;Initial Catalog=testdb;User ID=sa;Password=hh345;" );
cnn.Open ( );
SqlDataAdapter ad = new SqlDataAdapter ( "select * from hoteldictionary where HD_CNKEY = 1 AND HD_KEY = 232", cnn );
DateTime dtBegin = DateTime.Now;
for ( int i = 0; i < 100; i++ ) {
    DataTable dt = new DataTable ( );
    ad.Fill ( dt );
}
Console.WriteLine ( DateTime.Now.Subtract ( dtBegin ).TotalSeconds );
// EF
ctx.Connection.Open ( );
dtBegin = DateTime.Now;
for ( int i = 0; i < 100; i++ ) {
    var hotels1 = ctx.HotelDictionary.Where ( h => h.HD_CNKEY == 1 && h.HD_KEY == 232 ).Select ( h=> new { h.HD_NAME } ).ToArray ( );
}
Console.WriteLine ( DateTime.Now.Subtract ( dtBegin ).TotalSeconds );


HD_KEY является первичным ключом в небольшой таблице на 2500 записей, так что каждая из выборок возвращает одну запись. Пример результатов запуска:
0,53125
1,171875

Проверял многократно, с разным количеством итераций, но все равно получается, что прямая выборка целой записи из БД в два раза быстрее, чем выборка одной колонки через EF. Если в обоих случаях выбирать одну колонку, то скорость будет больше в три раза. При этом EF генерит примерно такой же запрос, который написан вручную, так что разница во времени выполнения целиком из-за EF. Не особо верится, что копирование данных из результатов запроса в поля объекта занимает столько же, сколько работа сервера по выборке и возвращению данных. В связи с этим возникли вопросы:
1) Действительно разница такая большая, или я в эксперименте что-то упустил?
2) Если действительно скорость отличается заметно, то это проблема только в EF, или другие ORM такие же? Я видел тесты скорости EF vs NHibernate, и там EF побеждал, поэтому не думаю, что выбрал самый плохой продукт для замера скорости.
3) Были ли у кого-нибудь реальные проблемы с нагрузкой на сервер из-за ORMов вообще и EF в частности? Если бы мне не приходилось делать много мелких запросов к базе, я бы даже не задумывался над этим — удобство наверняка превысит небольшое падение производительности. Но мне приходится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.