wie methoden aufrufe richtig cachen?

benhaze

Mitglied Platinum
Hallo!
Hat jemand ne Idee wie man am besten Methoden(-Aufrufe) cachen kann?

Ich hatte mir eine createMethodSignature(Method method, Object[] args) gebastelt,
die mit verschiedenen Methoden versuchte einen eindeutigen hash-wert
zu erzeugen.War nich so der bringer...
Die args haben mir immer wieder zu schaffen gemacht.
Ein ObjectArray welches echt *alles* beinhalten kann.

z.B:

Code:
Object invoke(Method method, Object[] args, boolean p_useCache)
{
    Object ret = null;
    int hash = createMethodSignature(method, args);
    if (m_cache.contains(hash))
        ret = m_cache.get(hash);
    else
    {
        ret = invoke(method,args);
        m_cache.put(hash,ret);
    }

    return ret;
}

hat jemand evtl. ein paar ideen, wie man sowas realisieren könnte?

DANKE!
Ben
 
Hallo,

für einen einfachen generischen Cache rechnet man normalerweise einen Hash über den "Methodenaufruf", also über die aufgerufene Methode sowie deren Parameterwerte.

Anschließend führt man den Methodenaufruf aus und speichert das Ergebnis in einer Map mit dem vorher berechneten Hash als Schlüssel.

Den könntest du beispielsweise so berechnen:
Java:
int methodInvocationHash = 31 * method.hashCode() + Arrays.hashCode(args);

Man könnte hier natürlich noch je nach aufgerufener Methode verschiedene Caching Strategien (LRU, MRU, etc.) hinterlegen...

Gruß Tom
 
super, danke für den Tipp!

noch eine kleine Frage,
wann nehme ich denn:

Code:
Arrays.hashCode(args);

und

Code:
Arrays.deepHashCode(args);
 
Hallo,

deepHashCode(...) traversiert Arrays / Collections und die darin enthaltenen Elemente rekursiv ab und nimmt diese ebenfalls zur hashcode Berechnung hinzu. Arrays.hashcode(...) läuft nur einmal über die Array Elemente drüber und berechnet deren hashcode "direkt".

Benutzen solltest du deepHashCode() wenns wirklich auf die genauen Inhalte des Objekt Arrays ankommt... (wie in diesem Fall.)

Gruß Tom
 
Zurück