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 %의 가격을 지불 할 수 없다. 여기에 점점
사용 절차
- 사용됩니다 메모리에 객체를 만들 때 소비됩니다. 또한 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);
에 충분하다? 또한 위의 진술에서 NHibernate가 실제로 더 빠릅니다 (867ms). –
당신이 측정하고 있다고 생각하는 것을 측정하고 있습니까? 표시 한 두 개의 쿼리는 * 정확히 * 같지만 (필드 및 테이블 별칭 제외) SQL 프로파일 러에서 이러한 종류의 실행 시간 차이를 초래할 수있는 방법을 알지 못합니다. –
또한 사용중인 NHibernate 버전을 알려주십시오. –