0

現在のケースはかなり複雑ですが、これまで説明できます。ConcurrentQueue<> に 300k オブジェクト (またはそれ以上、数字は統計のためのもの) があり、これらのオブジェクトはデータベースに格納する準備ができています。データベースに書き込みを行うために、いくつかのスレッドを使用しています。キューが空でない間、すべてのスレッドは次のことを行います。

  1. デキューできる場合
  2. オブジェクトを取る
  3. セッションを開く
  4. 取引を開く
  5. オブジェクトを永続化する
  6. トランザクションをコミットする
  7. セッションを閉じる
  8. 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 を

使用しています。

4

2 に答える 2

1

あなたの質問について
[1] スレッドの数を 2 倍にすると、実行時間が半分にならないのはなぜですか?
糸を増やせば作業が早く終わるというわけではありません。
その理由は、使用可能なメモリや、アプリケーションを実行するための他のリソースが少ないなどの理由である可能性があります。これをすべて決めるのはOSです。

于 2013-09-13T12:11:21.883 に答える
1

You may be doubling the number of threads, but you're just moving the bottleneck to the SQL server instance. You haven't doubled the resources that needs to do the same work in half the time.

I'd like to see the code for the thread if possible, can't think of any advise without.

于 2013-09-13T12:16:04.040 に答える