2012-03-13 4 views
-2

Я оцениваю производительность 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 из Интернета. Вот некоторые

  1. Использование сессионного
  2. Использования именованного запроса
  3. Session Промывка
  4. Использования хранимые процедуры
  5. Использования перекомпилированных опций

По моему времени опыта становится потребляется при создании объектов в памяти. Также запрос, который запускается из 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); 
+4

Вы факторизуя строительство сессионный завода? Также в вашем заявлении выше вы говорите, что NHibernate на самом деле быстрее (867 мс). –

+0

Вы уверены, что вы измеряете то, что, по вашему мнению, вы измеряете? Два указанных вами запроса * точно * одинаковы (кроме псевдонимов полей и таблиц), я не вижу, как они могут привести к таким различиям во времени выполнения в профилировщике SQL. –

+1

Также укажите, какую версию NHibernate вы используете. –

ответ

1

следующие экземпляры: полный 75k результат в отдельном списке;

IList<Employee> lstEmployee = ... 
return lstEmployees.ToList<Employee>(); 

достаточно

return lstEmployees; 
+0

Вы правы, но это не будет иметь большого значения –

Смежные вопросы