私は非常に多くの場合、独立して実行したい小さなオペレーションが多数あります。これらの場合、操作の数は各操作に要する実際の時間に比べて非常に大きいので、GCDのオーバーヘッドは通常は低いにもかかわらずオーバーヘッドのために各操作のタスクを作成するのは不適切です。GCDなどで適切な数のタスクを決定するにはどうすればよいですか?
なので、操作の数を各チャンクで動作する素敵なチャンクに分割してください。しかし、どのようにしてタスク/チャンクの適切な数を決定できますか?
私は非常に多くの場合、独立して実行したい小さなオペレーションが多数あります。これらの場合、操作の数は各操作に要する実際の時間に比べて非常に大きいので、GCDのオーバーヘッドは通常は低いにもかかわらずオーバーヘッドのために各操作のタスクを作成するのは不適切です。GCDなどで適切な数のタスクを決定するにはどうすればよいですか?
なので、操作の数を各チャンクで動作する素敵なチャンクに分割してください。しかし、どのようにしてタスク/チャンクの適切な数を決定できますか?
テストとプロファイリング。何が意味を成しているのか、また、うまくいくのはアプリケーション固有のものです。
基本的には二つのことを決定する必要があります:彼らは2で
プレイ上で動作しますチャンクの
これらの2つの変数を調整しながら、作業者に一連のテストデータ(基本的にはベンチマーク)を与え、スループットを自動的に測定することで、より簡単なバランスを見つけることができます。作業者サイズ/タスクチャンクサイズの組み合わせごとにスループットを記録し、最後に出力します。 最高のスループットが最良の組み合わせです。
どのくらい特定のタスクが実際にタスク自体に依存かかる場合最後に、(例えば、いくつかのタスクがX
時間がかかる、といくつかのX*3
時間がかかる一方で、あなたはアプローチのカップルを取ることができます。の性質に応じて、
X
時間、またはX*3
(またはその間にあるもの)が必要です。タスク自体を処理する前にその情報を使用して、現在のワークロードに応じて最適なスループットを達成するようにワーカー/タスクのサイズを動的に調整できます。このアプローチは、より高い負荷を処理するために必要なときに余分なVMをスピンアップし、負荷が低下したときなどにVMを戻すAmazon EC2で行われます。あなたが選ぶものは何でも、どんな未知のスピードの問題は、ほとんどの場合、それが実行される速度は、アプリケーションの成功に不可欠である場合には、デモのベンチマークのいくつかの種類を必要とする(時々処理する時間が非常に小さいので、その必要がありますそれはごくわずかです)。
幸運を祈る!