2016-08-05 13 views
0

Also mache ich lange Simulationen, im Grunde in C++. Ich habe mehrere Klassen mit vielen Mitgliedern und mehrere Operationen, die getan und erneuert werden müssen. Es gibt viele einfache Aufgaben, die mehrere Male erledigt werden müssen.
Für große Berechnungen habe ich sie einmal berechnet und als Mitglied gespeichert. Aber für einfache Berechnungen wie Addieren und Subtrahieren anderer Elemente, Berechnen der Norm von Element-Arrays usw., bin ich verwirrt, wenn ich ihnen die weise Entscheidung, die Leistung zu steigern, erspare.
Für diese Art einfacher Aufgabe ist es schneller, einfach jede benötigte Zeit zu berechnen oder die Ergebnisse der Berechnungen als neue Elemente zu speichern und bei Bedarf abzurufen.Alle einfachen Berechnungen speichern oder jedes Mal durchführen, wenn Ergebnisse benötigt werden?

Ich habe viele dieser einfachen wiederholenden Berechnungen, so dass dies den Code wirklich langweilig machen kann, Getters, Setter für alle.

+2

Wie fast alles andere, kommt es darauf an. Wie oft werden Sie diese "kleinen" Berechnungen durchführen? Wie oft ändern sich die Werte? Hast du versucht, beide Versuche zu messen? –

+5

Nur eine Möglichkeit zu wissen: messen. Ob Caching etwas sein wird oder nicht, kann im Allgemeinen nicht beantwortet werden. – Mat

+1

Wenn Ihr Ziel die Verbesserung der Leistung ist, müssen Sie viele Tests durchführen, um Engpässe zu finden und prüfen, welcher Ansatz in Ihrem Fall besser ist. – Ilya

Antwort

1

Memoization ist nicht so langwierig. Sie können es leicht wie diese:

template <class OUT,class IN> 
OUT calc(const IN& x){ 

    // (small) overhead for memoization 
    static std::map<IN,OUT> memo; 
    std::map<IN,OUT>::iterator found = memo.find(x); 
    if (found != memo.end()){ return found->second; } 

    // (possibly expensive) calculation 
    double result = doTheCalculation(x); // the actual calculation 
    memo[x] = result; 
    return result; 

} 

Wenn Sie dies in einer klugen Weise tun, müssen Sie nicht sogar das Memo-Code für jede Funktion schreiben müssen, wo Sie es verwenden möchten, aber es einfach für mehrere Funktionen wiederverwenden. Ob es sich lohnt, dies vollständig zu tun, hängt von Ihrer Anwendung ab und der einzige Weg, dies herauszufinden, ist es, es zu messen.

Beachten Sie, dass das obige Verfahren möglicherweise effizienter ist, indem Sie die map mit einer unordered_map ersetzen.