Сравнение производительности NHibernate и ADO.NET - PullRequest
0 голосов
/ 13 марта 2012

Я оцениваю производительность NHibernate и ADO.NET. Я создал тестовое приложение, в котором есть таблица Employee с 75 000 записей. Когда я пытаюсь получить данные с помощью NHibernate, это очень медленно по сравнению с ADO.NET, примерно на 290% (приблизительно) медленнее.

Средняя производительность NHibenrnate для связывания 75 000 записей составляет 2535 миллисекунд.
Средняя производительность ADO.net для связывания 75 000 записей составляет 867 миллисекунд.

Я понимаю, что NHibernate - это оболочка для ADO.NET, но вы не можете заплатить 300% за поиск

Мы попробовали советы по оптимизации для NHibernate из Интернета. Вот некоторые

  1. Использование сеанса без сохранения состояния
  2. Использование именованного запроса
  3. Session Flushing
  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_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);

1 Ответ

1 голос
/ 13 марта 2012

следующие копии всех 75 тыс. Результатов приводятся в отдельном списке;

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

достаточно для

return lstEmployees;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...