2016-05-06 10 views
0

Nehmen wir an, es gibt eine Funktion, die ich millionenfach aufrufen muss. Arithmetische Operationen, die von dieser Funktion ausgeführt werden, sind nicht so schwer, so dass es nur darauf ankommt, wie schnell alle Variablen zugewiesen werden. Wir nehmen auch an, dass die Variable immer auf Stapel zugeordnet ist. Das einfachste Fall Beispiel:Optimierung häufig aufgerufener Funktionen mit großen lokalen Variablen (C++)

void doSomething(){ 
    int aReallyLargeVariable[10000]; 
    ...performing a few light operations on that variable and returning nothing... 
} 

Ich weiß, dass, wenn die Funktion es ist alles wieder Variablen zerstört werden, so
wäre es nicht besser, diese Variable cachen, indem sie statisch oder global zu machen? Was wäre der beste Weg, um es zu optimieren?

+1

Machen Sie die Variable zu einem Parameter der Funktion und verwenden Sie die gleiche Variable für viele Funktionsaufrufe? – rozina

+0

Wird die Funktion rekursiv oder gleichzeitig aufgerufen? –

+1

Und - da Sie bereits alternative Designs kennen, können Sie Ihre Benchmark-Ergebnisse mit den Vergleichen teilen, die Sie sicherlich schon durchgeführt haben? –

Antwort

3

Es ist nicht die Zuweisung, die Leistungsproblem verursacht. Das Problem ist, es so zu initialisieren, wenn

int aReallyLargeVariable[10000]; 

werden nicht viele Zeit in Anspruch nehmen die

int aReallyLargeVariable[10000] = {0}; 

tun. Auch das dynamische Erstellen von großen Objekten kann ein Problem verursachen.

Wenn Sie eine Funktion haben, die keine sehr schwere Logik hat und nur primitive Typen verwendet, definieren Sie sie einfach als inline und sorgen Sie sich nicht um die Leistung.

Wenn Sie große Menge an Objekt denken über eine andere Datenstruktur wie stack oder vector die

1

1000 oder mehr Elemente haben müssen, nicht definieren, um diese Funktion zu optimieren, erwägt es oft genannt wird, die Der erste Schritt müsste do not declare the large variable locally sein. Wenn Sie das tun, passieren ein paar Dinge:

  • viel Stapelraum ist verschwendet, da Sie das Array lokal deklariert und wahrscheinlich nur ein paar Werte verwenden.
  • die Stapeloperationen (Push/Pop), die durch diese Deklaration verursacht werden, überwiegen wahrscheinlich die tatsächliche Arbeit, die die Funktion zu tun hat.
  • Sie sind besser dran, dieses Array woanders zu deklarieren (deklarieren Sie es global, wenn Sie müssen) und übergeben Sie einen Zeiger auf das Array. Auf diese Weise können Sie auch den Speicher wiederverwenden und keine Zeitverschwendung verschwenden.

    +0

    Wie m.antkowicz sagt, wird die Zeit, die für die Stapeloperationen selbst benötigt wird (Push/Pop), nicht von der Größe der lokalen Variablen beeinflusst. Diese Operationen ändern nur einen Registerwert. –

    Verwandte Themen