2

NHibernate3.3とFirebird2.5.1でパフォーマンスの問題があります。ASP.NET MVCとローカル(!)Firebirdデータベースを使用して非常に単純な例を作成しました。しかし、次のコードは実行に約1秒かかりますか?!?

        var startTickCountWrite = Environment.TickCount;

        IRepository<Project> repository = facade.ProjectRepository(null);
        for (int i = 1; i <= 250; ++i)
        {
            var myProject = new Project { ProjectId = i };
            repository.Insert(myProject);
        }
        repository.Commit();

        var endTickCountWrite = Environment.TickCount;

commit()をforループ内に配置すると、約5秒かかります。

リポジトリとファサードの裏側は特別なものではありません。プロジェクトをISession.Insertに転送します。

プロジェクトには、プロパティとしてIDとProjectIDのみがあります。

誰かが何がうまくいかないのか教えてもらえますか?

ありがとう、アンドレアス

4

1 に答える 1

1

1秒間に250個のオブジェクトが驚くほど遅く聞こえることはありません。パフォーマンスを評価するために、いくつかの比較を提供することも良いでしょう-Firebirdに対して直接同じ量のSQLを実行するのにどれくらいの時間がかかりますか?

NHibernateは状況によってはINSERTステートメントをバッチ処理できますが、これがFirebirdで機能するかどうかはわかりません。http://nhibernate.info/doc/nh/en/index.html#performance-batch-updatesIDジェネレーターの選択も影響を与える可能性があります。一部のジェネレーターは、NHibernateにINSERTステートメントをすぐに実行するように強制します。これにより、バッチ処理を使用できなくなります。

設計の観点から、いくつかの変更が必要になる場合があります。IRepository.Insert()は、コレクションインターフェイスを模倣しているため、通常はAdd()という名前です(コレクションに挿入する場合は、通常、関連性のないインデックスパラメーターを取ります)。もちろんここに)。また、Commit()はリポジトリ上で適切ではないように見えます。これは、通常、同じトランザクションとセッションを共有する複数のリポジトリインスタンスが関係しているためです。

正確な時間測定には、System.DiagnosticsのStopwatchを使用できるため、値を自分で変換する必要はありません。

于 2012-09-06T21:03:01.913 に答える