Я написал код для сравнения производительности C# Ado.Net и Entity Framework 6.1.3. Я вызываю хранимую процедуру, которая возвращает около 20 000 записей сотрудников, а затем сопоставляет эти данные в список объектов «Личность». Затем я провел 1000 итераций этого кода и вычислил среднее время.Почему C# Ado.net медленнее, чем Entity Framework 6.1.3?
Вот тайминги:
Ado Net: 638 мс
Entity Framework: 544 мс
К моему удивлению, Ado Net составляет около 100 мс медленнее, чем Entity Framework.
код Ado.Net:
//GetAllPersons is a stored proc hosted in Local DB instance
var adapter = new SqlDataAdapter("GetAllPersons", conn);
adapter.Fill(dt);
//Using Fast member library
var accessor = TypeAccessor.Create(typeof(Person));
MemberSet members = accessor.GetMembers();
var list = new List<Person>();
foreach(DataRow row in dt.Rows)
{
var person = new Person();
foreach (var member in members)
{
if (row[member.Name] != DBNull.Value)
{
accessor[person, member.Name] = row[member.Name];
}
}
list.Add(person);
}
Entity Framework:
var context = new AdventureWorks2012Entities1();
List<Person> list = context.GetAllPersons().ToList();
Часть кода, который использует SQL Adatper для загрузки Datatable является один принимая большую часть времени. Я попытался использовать SQL Datareader, но это было еще хуже. Я что-то пропустил, потому что предположительно простой Ado.Net должен быть быстрее, чем Entity Framework?
EF основан на Ado.Net, следовательно, он не может быть быстрее, чем чистая реализация Ado.Net. Однако вы реализовали менее идеальное решение с циклом в цикле и другими служебными данными. Я считаю, что внутренняя реализация EF более умна и, возможно, использует инициализацию контекста вместо внутреннего цикла. Эксперимент: иметь только одного сотрудника в таблице и сравнивать. –
'DataAdapter.Fill (DataTable)' очень медленно. Перепишите код на использование ручного сопоставления - это намного быстрее. –
@QualityCatalyst Да, это имеет смысл. Как вы предположили, я запустил код для одного сотрудника, а Ado .Net был примерно на 50% быстрее, чем Entity Framework. Я продолжал увеличивать число сотрудников и достиг порога около 100 сотрудников, когда EF начала принимать участие. – Ketan