2012-03-13 2 views
-2

NHibernate 및 ADO.NET의 성능을 평가했습니다. 75,000 개의 레코드가있는 Employee 테이블이있는 테스트 애플리케이션을 만들었습니다. NHibernate를 사용하여 데이터를 얻으려고하면 ADO.NET에 비해 매우 느립니다. 290 % (약)입니다.성능 비교 NHibernate 및 ADO.NET

75,000 레코드를 바인딩하는 NHibenrnate의 평균 성능은 밀리 초입니다.
75,000 레코드를 바인딩하는 ADO.net의 평균 성능은 밀리 초입니다.

내가 NHibernate에이 ADO.NET에 래퍼는 것을 이해 할 수 있지만 우리는 인터넷에서 NHibernate에 대한 최적화 팁을 시도 검색

에 대한 300 %의 가격을 지불 할 수 없다. 여기에 점점

  • 세션 플러싱
  • 내 경험 시간당으로 다시 컴파일 옵션
  • 사용 절차

  • 을 저장하여 명명 된 쿼리의 상태 세션
  • 사용의 일부

    1. 사용됩니다 메모리에 객체를 만들 때 소비됩니다. 또한 NHibernate 및 SQL 프로파일 러에서 발생시키는 쿼리 차이가 있습니다. 또 다시

      실행하면 어떤 차이를 만들하지 않습니다 직원에서

      선택 ID, 이름, DateOfJoin, 생년월일 (DateOfBirth), DepartmentID, 상태 : 기간 Name2_0_, this_.DateOfJoin 등 516 선택 ID2_0_로 this._ID, this_.Name DateOfBirth2_0_로 DateOfJoin2_0_, this_.DateOfBirth로, Status2_0_로 dbo.Employee this_에서 DepartmentID2_0_, this_.Status로 this_.DepartmentID : 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가 실제로 더 빠릅니다 (867ms). –

    +0

    당신이 측정하고 있다고 생각하는 것을 측정하고 있습니까? 표시 한 두 개의 쿼리는 * 정확히 * 같지만 (필드 및 테이블 별칭 제외) SQL 프로파일 러에서 이러한 종류의 실행 시간 차이를 초래할 수있는 방법을 알지 못합니다. –

    +1

    또한 사용중인 NHibernate 버전을 알려주십시오. –

    답변

    1

    다음은 완전한 75k 결과를 별도의 목록으로 복사합니다.

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

    당신이 세션 공장 건물을 고려해인가가

    return lstEmployees; 
    
    +0

    맞지만 차이는별로 없습니다. –