高価な計算の結果をキャッシュするために使用しているコンピューティング マップ(ソフト値) があります。
ここで、特定のキーが次の数秒以内に検索される可能性が高いことがわかっている状況があります。そのキーは、ほとんどのキーよりも計算コストも高くなります。
最小優先度のスレッドで値を事前に計算して、値が最終的に要求されたときに既にキャッシュされているようにして、応答時間を改善したいと思います。
次のようにこれを行う良い方法は何ですか:
- 計算が実行されるスレッド (具体的にはその優先度) を制御できます。
- 重複作業が回避されます。つまり、計算は 1 回だけ実行されます。計算タスクが既に実行されている場合、呼び出し元のスレッドは、値を再度計算する代わりにそのタスクを待機します (
FutureTask
これを実装します。Guava の計算マップでは、呼び出しのみの場合は true ですがget
、呼び出しと組み合わせた場合は異なりますput
。) - 「事前に値を計算する」方法は、非同期で冪等です。計算がすでに進行中の場合は、その計算が完了するのを待たずにすぐに戻る必要があります。
- 優先度の逆転を回避します。たとえば、優先度の高いスレッドが値を要求し、優先度が中程度のスレッドが無関係なことを行っているが、計算タスクが優先度の低いスレッドでキューに入れられている場合、優先度の高いスレッドを飢えさせてはなりません。おそらくこれは、計算スレッドの優先度を一時的に上げたり、呼び出しスレッドで計算を実行したりすることで実現できます。
関連するすべてのスレッド間でこれをどのように調整できますか?
追加情報
私のアプリケーションでの計算は画像フィルタリング操作です。つまり、すべて CPU バウンドです。これらの操作には、アフィン変換 (50 マイクロ秒から 1 ミリ秒までの範囲) と畳み込み (最大 10 ミリ秒) が含まれます。もちろん、さまざまなスレッドの優先度の有効性は、OS がより大きなタスクをプリエンプトする能力に依存します。