Pracuję nad aplikacją .NET 4.0, która wykonuje dość drogie obliczenia dla dwóch podwójnych zwracających podwójne. Obliczenia wykonuje się dla każdego z kilku tysięcy pozycji . Obliczenia te są wykonywane w Task
wątku puli wątków.
Niektóre wstępne testy wykazały, że te same obliczenia są wykonywane w kółko, więc chciałbym buforować n wyników. Gdy bufor jest pełny, chciałbym wyrzucić najsłabiej często ostatnio używanego elementu. ( Edycja: zdałem sobie sprawę, że najmniej często nie ma sensu, ponieważ gdy pamięć podręczna jest pełna i zastąpiłbym wynik nowo obliczonym, ten byłby najmniej używany i natychmiast zastępowany następnym razem, gdy obliczany jest nowy wynik i dodane do pamięci podręcznej)
Aby to zaimplementować, zastanawiałem się nad użyciem Dictionary<Input, double>
(gdzie Input
byłaby mini-klasa przechowująca dwie podwójne wartości wejściowe) do przechowywania danych wejściowych i wyników w pamięci podręcznej. Musiałbym jednak również śledzić, kiedy wynik został wykorzystany ostatnim razem. W tym celu myślę, że potrzebowałbym drugiej kolekcji przechowującej informacje potrzebne do usunięcia wyniku ze słownika, gdy pamięć podręczna się zapełnia. Obawiam się, że ciągłe sortowanie tej listy wpłynęłoby negatywnie na wydajność.
Czy istnieje lepszy (tj. Bardziej wydajny) sposób, aby to zrobić, a może nawet wspólna struktura danych, której nie jestem świadomy? Jakie rzeczy powinienem profilować / mierzyć, aby określić optymalność mojego rozwiązania?