Ich habe eine computing map (mit soft values), die ich verwende, um die Ergebnisse einer teuren Berechnung zwischenzuspeichern.Rechenkarte: Rechenwert vor der Zeit
Jetzt habe ich eine Situation, in der ich weiß, dass ein bestimmter Schlüssel wahrscheinlich innerhalb der nächsten Sekunden nachgeschlagen wird. Dieser Schlüssel ist auch teurer zu berechnen als die meisten.
Ich möchte den Wert im Voraus in einem Thread mit minimaler Priorität berechnen, so dass der Wert, wenn er schließlich angefordert wird, bereits zwischengespeichert wird, wodurch die Antwortzeit verbessert wird.
Was für eine gute Möglichkeit ist, dies so zu tun:
- Ich habe die Kontrolle über das Gewinde (insbesondere seine Priorität), in dem die Berechnung durchgeführt wird.
- Doppelarbeit wird vermieden, d. H. Die Berechnung wird nur einmal durchgeführt. Wenn die Berechnungsaufgabe bereits ausgeführt wird, wartet der aufrufende Thread auf diese Aufgabe, anstatt den Wert erneut zu berechnen (
FutureTask
implementiert dies. Bei Guavas Computing Maps ist dies der Fall, wenn Sie nurget
aufrufen, aber nicht, wenn Sie ihn mit Aufrufen vonput
mischen.) - Die Methode "Berechnungswert im Voraus" ist asynchron und idempotent. Wenn eine Berechnung bereits ausgeführt wird, sollte sie sofort zurückkehren, ohne darauf zu warten, dass diese Berechnung beendet wird.
- Vermeiden Sie die Prioritätsinversion, z. Wenn ein Thread mit hoher Priorität den Wert anfordert, während ein Thread mit mittlerer Priorität einen nicht verwandten Vorgang ausführt, der Task für die Berechnung jedoch für einen Thread mit niedriger Priorität in die Warteschlange gestellt wird, darf der Thread mit hoher Priorität nicht ausgehungert werden. Vielleicht könnte dies erreicht werden, indem vorübergehend die Priorität der Computer-Threads erhöht wird und/oder die Berechnung auf dem aufrufenden Thread ausgeführt wird.
Wie könnte dies zwischen allen beteiligten Threads koordiniert werden?
Zusatzinfo
Die Berechnungen in meiner Anwendung sind Bildfiltervorgänge, das heißt, sie sind alle CPU-gebunden. Diese Operationen umfassen affine Transformationen (im Bereich von 50 μs bis 1 ms) und Faltungen (bis zu 10 ms). Natürlich hängt die Wirksamkeit unterschiedlicher Thread-Prioritäten von der Fähigkeit des OS ab, die größeren Aufgaben zu verhindern.
Sie möchten einen Schlüssel für den Precomputation-Cache vorberechnen und zwischenspeichern? Kannst du, äh ... es im Precomputation-Cache speichern? –
@BlueRaja, das die Anforderungen Nr. 1, nicht jedoch Nr. 2, Nr. 3 oder Nr. 4 erfüllt. – finnw