2012-03-13 12 views
-2

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%の価格を支払うことができません。ここに私の経験あたりの時間として再コンパイルオプション

を使用してストアドプロシージャ

  • を使用して名前付き問合せ
  • セッションフラッシング
  • の一部

      ステートレスセッションの
    1. 使用
    2. 使用して取得されていますメモリ内にオブジェクトを構築するときに消費されます。また、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); 
      
  • +4

    には十分でしょうか?また、上のあなたのステートメントでは、NHibernateが実際にはもっと速いと言います(867 ms)。 –

    +0

    あなたはあなたが測定していると思っているものを測定していますか?表示された2つのクエリは*正確に同じです(フィールドとテーブルのエイリアスを除いて)、SQLプロファイラの実行時間にこれらの違いがどのように発生するかはわかりません。 –

    +1

    あなたが使用しているNHibernateのバージョンもお知らせください。 –

    答えて

    1

    以下は完全な75k結果を別のリストにコピーします。

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

    あなたがセッション工場の建物を因数分解しています

    return lstEmployees; 
    
    +0

    あなたは正しいですが、それほど大きな違いはありません –

    関連する問題