Я оцениваю производительность NHibernate и ADO.NET. Я создал тестовое приложение, в котором есть таблица Employee с 75 000 записей. Когда я пытаюсь получить данные с помощью NHibernate, это очень медленно по сравнению с ADO.NET, примерно на 290% (приблизительно) медленнее.
Средняя производительность NHibenrnate для связывания 75 000 записей составляет 2535 миллисекунд.
Средняя производительность ADO.net для связывания 75 000 записей составляет 867 миллисекунд.
Я понимаю, что NHibernate - это оболочка для ADO.NET, но вы не можете заплатить 300% за поиск
Мы попробовали советы по оптимизации для NHibernate из Интернета. Вот некоторые
- Использование сеанса без сохранения состояния
- Использование именованного запроса
- Session Flushing
- Использование хранимой процедуры
- Использование перекомпилированной опции
Согласно моему опыту, время потребляется при построении объектов в памяти. Также есть различия между запросами, запускаемыми из 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_320 * 1032 из ДБ.
Просьба предложить любой другой механизм повышения производительности. Какая должна быть идеальная разница в производительности при использовании 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);