Я оцениваю производительность NHibernate и ADO.NET. Я создал тестовое приложение с таблицей Employee с 75 000 записей. Когда я пытаюсь получить данные с помощью NHibernate, это очень медленно сравнивается с ADO.NET, это примерно 290% (прибл.) Медленнее.Сравнение производительности NHibernate и ADO.NET
Средняя производительность NHibenrnate для связывания 75 000 записей - миллисекунд.
Средняя производительность ADO.net для привязки 75 000 записей: миллисекунд.
Я понимаю, что NHibernate является оберткой для ADO.NET, но вы не можете заплатить 300% для поиска
Мы попытались советы по оптимизации NHibernate из Интернета. Вот некоторые
- Использование сессионного
- Использования именованного запроса
- Session Промывка
- Использования хранимые процедуры
- Использования перекомпилированных опций
По моему времени опыта становится потребляется при создании объектов в памяти. Также запрос, который запускается из NHibernate и SQL в профилировщике, имеет различия. Не имеет никакого значения, если выполняется снова и снова
Выберите ID, имя, DateOfJoin, DateOfBirth, DepartmentID, Состояние от Работника: Продолжительность 516 Выберите this._ID в ID2_0_, this_.Name в Name2_0_, this_.DateOfJoin а DateOfJoin2_0_, this_.DateOfBirth как DateOfBirth2_0_, this_.DepartmentID, как DepartmentID2_0_, this_.Status, как Status2_0_ от dbo.Employee this_: Продолжительность 1538
Просьба предложить какой-либо другой механизм для повышения производительности. Какая должна быть идеальная разница в производительности при использовании ORM?
Пожалуйста, найдите код ниже ....
//Employee Class
public class Employee
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual DateTime DateOfJoin { get; set; }
public virtual DateTime DateOfBirth { get; set; }
public virtual string DepartmentID { get; set; }
public virtual string Status { get; set; }
}
//NHibernate Mapping
public EmployeeMap()
{
Table("Employee");
Id(p => p.ID).GeneratedBy.Increment();
Map(p => p. Name);
Map(p => p. DateOfJoin);
Map(p => p. DateOfBirth);
Map(p => p. DepartmentID);
Map(p => p. Status);
}
//Building Session Factory
public static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("Connection")))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Employee>())
.BuildSessionFactory();
}
return _sessionFactory;
}
}
//Fetching data using CreateQuey
using (IStatelessSession session = SessionManager.SessionFactory.OpenStatelessSession())
{
IList<Employee> lstEmployee = session.CreateCriteria<Employee>().List<Employee>();
return lstEmployees.ToList<Employee>();
}
//Fetching data using Create Query
using (IStatelessSession session = SessionManager.SessionFactory.OpenStatelessSession())
{
IList<Employee> lstEmployee = session.CreateQuery("from Employee "). List<Employee>();
return lstEmployees.ToList<Employee>();
}
//Fetching Data using ADO.net
DataTable dtEmployees = /*Data is fetched from ADO.net using SQL Query*/;
List<Employee> lstEmployee = new List<Employee>();
foreach (DataRow dr in dtEmployees.AsEnumerable())
{
Employee employee = new Employee
{
ID = dr.Field<int>("ID"),
Name = dr.Field<decimal>("Name"),
DateOfJoin = dr.Field<int>("DateOfJoin"),
DateOfBirth = dr.Field<int>("DateOfBirth"),
DepartmentID = dr.Field<int>("DepartmentID"),
Status = dr.Field<DateTime>("Status"),
};
lstEmployee.Add(Employee);
Вы факторизуя строительство сессионный завода? Также в вашем заявлении выше вы говорите, что NHibernate на самом деле быстрее (867 мс). –
Вы уверены, что вы измеряете то, что, по вашему мнению, вы измеряете? Два указанных вами запроса * точно * одинаковы (кроме псевдонимов полей и таблиц), я не вижу, как они могут привести к таким различиям во времени выполнения в профилировщике SQL. –
Также укажите, какую версию NHibernate вы используете. –