NHibernateとADO.NETのパフォーマンスを評価しました。 75,000レコードのEmployeeテーブルを持つテストアプリケーションを作成しました。 NHibernateを使ってデータを取得しようとすると、ADO.NETと比較して非常に遅いですが、約290%(約)の速度が遅くなります。パフォーマンス比較NHibernateとADO.NET
75,000レコードを結合するNHibernateの平均パフォーマンスはミリ秒です。
75,000レコードをバインドするADO.netの平均パフォーマンスはミリ秒です。
私はNHibernateのは、ADO.NETへのラッパーであることを理解できますが、私たちは、インターネットからNHibernateのための最適化のヒントを試してみました検索
のために300%の価格を支払うことができません。ここに私の経験あたりの時間として再コンパイルオプション
を使用してストアドプロシージャ
-
ステートレスセッションの
- 使用
- 使用して取得されていますメモリ内にオブジェクトを構築するときに消費されます。また、NHibernateとプロファイラのSQLから起動しているクエリには違いがあります。再度実行する場合は任意の違いを確認して、もう一度
選択ID、名前、DateOfJoin、dateOfBirthの、のDepartmentID、従業員からのステータスません:Name2_0_、this_.DateOfJoinとしてID2_0_、this_.Nameとして期間516 選択this._ID this_ dbo.EmployeeからStatus2_0_としてDateOfJoin2_0_、DateOfBirth2_0_、DepartmentID2_0_としてthis_.DepartmentIDとしてthis_.DateOfBirth、this_.Statusとして:期間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が実際にはもっと速いと言います(867 ms)。 –
あなたはあなたが測定していると思っているものを測定していますか?表示された2つのクエリは*正確に同じです(フィールドとテーブルのエイリアスを除いて)、SQLプロファイラの実行時間にこれらの違いがどのように発生するかはわかりません。 –
あなたが使用しているNHibernateのバージョンもお知らせください。 –