4

これに対する正しい答えは、プールされたオブジェクトのタイプとワークロードに依存すると確信しているので、実装について少し詳しく説明します。

長時間実行されるコマンドラインプロセスをプールするために使用されるObjectPoolがあります。これらのプロセスはstdin/stdoutを介して通信し、ファイル/ネットワーク操作を実行します。多くのタスクは他のタスクよりもはるかに速く完了し、プロセスをプールにすばやく戻すことができます。プールへのすべてのアクセスはスレッドセーフである必要があります。

私の質問は、LIFO/スタックまたはFIFO/ ConcurrentLinkedQueueでプールを管理する方が良いですか?両側の私の推論:

  • スタックは、リソースがキャッシュされたままになる可能性がある「ホット」オブジェクトを再生し続けます。長いため。
  • FIFOは、プロセス間で呼び出しのバランスを取り、各プロセスの作業量を減らします。ありがとう!
4

2 に答える 2

3

私の最初の考えは、それをベンチマークすることでした!あなたの主張はどちらも理にかなっているように見えます。両方の戦略を実装し、どちらがより高いスループットをもたらすかをテストする必要があります。

質問で説明した問題は、オペレーティング システムが直面しなければならないプロセス スケジューリングに似ています。したがって、優先順位を利用すると便利な場合があります。PriorityQueueを使用して、時間の経過とともに動的に変化する可能性のあるさまざまな優先度をタスクに割り当てます (たとえば、Agingなど) 。

最後になりましたが、コメントで既に指摘されているように、ConcurrentLinkDequeの両方を試して、フロント オブジェクトとリア オブジェクトをフェッチすることができます。ここでも、どのバランスが最も効果的かを試して測定することをお勧めします。

于 2012-07-20T00:28:46.600 に答える
1

パフォーマンスの違いにはならないかもしれません。コーディングが最も簡単で、コードを理解しやすいものにします。ファイルやネットワーク I/O を実行するコマンド ライン プロセスを扱っている場合、ここでキャッシュ ミスが発生しても違いはありません。

于 2012-07-20T00:36:07.450 に答える