2010-10-16 8 views
5

Ich schreibe gerade eines meiner Programme neu. Es hat eine stark rekursive Funktion, die peg-Solitär löst:C: Was ist schneller, Zugriff auf globale Variable oder Übergabe eines Zeigers an die Funktion

int solve(int draw) { 
    if (finished()) 
    return true; 

    //loop over every possible move (about 76 long values) 
    //do a move (access the board, which is a long value) 
    if (solve(draw + 1)) 
    return true; 

    return false; 
} 

Also ich frage mich, ob es schneller ist wie folgt zu verwenden lösen:

solve(int draw, long **moves, long *board) {} 

Im Moment beide Bewegungen und Board sind globale Variablen.

Natürlich werde ich es testen, aber wenn jemand mir sagt, dass dieser Versuch nicht effizient sein wird, werde ich etwas Zeit sparen :).

freundlichen Grüßen

+1

Die erste Regel der Optimierung ist, Sie sprechen nicht über Optimierung. –

Antwort

9

Es wird wahrscheinlich nicht so effizient sein, aber der einzige Weg, um sicher zu wissen, ist Ihr Code zu profilieren. Wenn der Großteil Ihrer Ausführungszeit damit verbracht wird, Ihre eigentliche Spiellogik auszuführen, dann sollte der kleine Overhead, der einige Argumente auf den Stack legt, vernachlässigbar sein.

Aus der Sicht des Designs ist es jedoch viel besser, globale Variablen zu vermeiden. Es ermöglicht, dass Ihr Code statusfrei und somit potentiell reentrant und Thread-sicher ist. Dies kann jedoch für Ihre Anwendung relevant sein oder auch nicht.

+1

Der andere Vorteil zur Vermeidung von Globalen ist, dass Unit-Tests einfacher sind. –

1

Es gibt bestimmte Overhead mit der Übergabe von Parametern zu Funktion - Schreiben von Parametern zu stapeln. In der Mehrheit (wahrscheinlich alle) der modernen Architekturen Stack-Zugriff und globalen Datenzugriff haben die gleiche Geschwindigkeit, so dass die wahrscheinlichsten Parameter werden ein wenig langsamer.

+0

Es gibt einige Architekturen, die Funktionsargumente in CPU-Registern übergeben. Die damit verbundene Leistungssteigerung wird jedoch eliminiert, wenn Sie die Funktion rekursiv verwenden. –

2

Das sieht aus wie Optimierung zu früh!

Jedes Mal, wenn Sie solve() aufrufen, müssen Sie prüfen, ob Sie fertig sind(). Die Kosten der fertigen() Prüfung werden jeden Unterschied in der variablen Zugriffszeit wegblasen.

Zuerst korrigieren, dann Profil, wenn es zu langsam ist, dann optimieren!

2

Ich glaube nicht, dass dies der Leistungsengpass ist.

Das einzige, was das mir in den Sinn kommt, ist man mit dem Code zeigen:

Haben Sie lange lange Variablen müssen? Sie benötigen normalerweise mehr Platz, was mehr Zeit bedeutet, sie zu nutzen. Ich erinnere mich, sobald ich doppelte Variablen durch Float-Variablen ersetzte und einen BIG-Boost bekam (50% weniger Ausführungszeit). Dies kann ein wenig helfen :)

+0

Leider kann das Peg Board 33 Pegs halten, weshalb ich mehr als 32 Bit benötige :(. – imbaer

+0

Ich bin ziemlich sicher, dass 'lang lang' - wenn diese als 64-Bit Integer genommen werden sollen - werden auf modernen CPUs nicht langsamer sein als alles andere. –

Verwandte Themen