現在のケースはかなり複雑ですが、これまで説明できます。ConcurrentQueue<> に 300k オブジェクト (またはそれ以上、数字は統計のためのもの) があり、これらのオブジェクトはデータベースに格納する準備ができています。データベースに書き込みを行うために、いくつかのスレッドを使用しています。キューが空でない間、すべてのスレッドは次のことを行います。
- デキューできる場合
- オブジェクトを取る
- セッションを開く
- 取引を開く
- オブジェクトを永続化する
- トランザクションをコミットする
- セッションを閉じる
- 1に行きます。
いくつかのテストの後、結果があります
- 2 つのスレッドが 00:00:49.4008256 の平均時間で 300k オブジェクトを保持
- 4 つのスレッドが 00:00:29.6146939 の平均時間で 300k オブジェクトを保持
- 10 スレッドが 00:00:24.0903779 平均時間で 300k オブジェクトを保持
- 20 スレッドが 00:00:19.7451293 平均時間で 300k オブジェクトを保持
- 40 スレッドが 00:00:18.2760453 平均時間で 300k オブジェクトを保持
[1] スレッド数を 2 倍にしても、実行時間が半分にならないのはなぜですか?
[2] そして、トランザクション内のオブジェクトの数を増やすことなくこれを改善する方法はありますか? MSSQL 2012 で NHibernate を
使用しています。