C Zeiger vs direktes Mitglied Zugang für structs
Sagen, dass ich eine Struktur wie die folgende ...
typedef struct {
int WheelCount;
double MaxSpeed;
} Vehicle;
... und ich habe eine Globale variable dieses Typs (ich bin mir wohl bewusst der Gefahren von globals, das ist für ein embedded system, das ich nicht design, und für die Sie eine unglückliche, aber notwendige übel.) Ist es schneller, um den Zugang der Mitglieder des struct direkt oder über einen pointer ? ie
double LocalSpeed = MyGlobal.MaxSpeed;
oder
double LocalSpeed = pMyGlobal->MaxSpeed;
Einer meiner Aufgaben ist es, zu vereinfachen und zu beheben einen vor kurzem geerbt embedded-system.
- Was macht ein pointer Ihnen mit, dass der direkte Zugriff nicht? Und ein Zeiger langsamer.
- -1 für Fragen Mikro-Optimierung ohne benchmarking es zuerst.
InformationsquelleAutor Alex Marshall | 2009-08-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen, ich würde sagen, gehen mit der ersten option:
Dadurch hat man weniger zu dereferenzieren (Sie ' re nicht finden, die Zeiger dann dereferenzieren, um Sie zu erhalten, um die Lage). Es ist auch einfacher und leichter zu Lesen und zu pflegen, da Sie nicht brauchen, um das Zeiger-variable zusätzlich zu der Struktur.
Dass gesagt wird, ich glaube nicht, dass ein performance-Unterschied, den Sie sehen würden, wäre erkennbar, auch auf einem embedded-system. Beide werden sehr schnelle Zugriffszeiten.
Die erste sollte schneller sein, da es nicht erforderlich ist, Zeiger dereferenzieren. Dann wieder das ist wahr für x86-basierte Systeme, die sicher nicht für andere.
auf x86, die erste würde übersetzen, so etwas wie dieses
und das zweite wäre so etwas wie dies
Auf Ihre embedded-Plattform, ist es wahrscheinlich, dass die Architektur so optimiert, dass es im wesentlichen ein waschen, und selbst wenn es war nicht Sie würde nur jemals bemerkt, dass die Leistung auswirken, wenn diese ausgeführt wurde, in einer sehr engen Schleife.
Gibt es wahrscheinlich viel mehr offensichtliche performance-Bereiche Ihres Systems.
Dies ist der Montage-Ausgang mit VS2008 release-Modus:
zerlegen, zerlegen, zerlegen...
Je nach code-Zeilen sind Sie nicht, uns zu zeigen, es ist möglich, dass, wenn Sie den Mauszeiger etwas statisch ein guter compiler wird wissen, dass und vor-berechnen, die Adresse für beides. Wenn Sie nicht über Optimierungen dann ist diese ganze Diskussion zu mute ist. Es hängt auch davon ab, den Prozessor, den Sie verwenden, die beide durchgeführt werden können mit einer einzigen Anweisung je nach Prozessor. Also ich befolgen Sie die grundlegenden Optimierungs-Schritte:
1) zerlegen und untersuchen
2) Zeit der Ausführung
Wie oben erwähnt aber die Quintessenz ist, kann es ein Fall von zwei Anweisungen anstelle einer Kalkulation eines einzigen Taktzyklus ein-Sie würde wahrscheinlich nie sehen. Die Qualität Ihrer compiler und optimizer-Entscheidungen zu machen sind viel dramatischer performance-Unterschiede als zu versuchen zu zwicken, eine Zeile code, in der Hoffnung, die Verbesserung der Leistung. Schalt-Compiler können geben Sie 10-20% in beide Richtungen, manchmal auch mehr. Wie ändern Sie Ihre Optimierungs-flags, drehen alles auf nicht der Schnellste code, manchmal -O1 besser abschneidet als -O3.
Verstehen, was die zwei Zeilen code zu produzieren und wie maximieren Sie die Leistung von high-level-Sprache kommt aus der Kompilierung für unterschiedliche Prozessoren und Demontage mit verschiedenen Compilern. Und noch wichtiger ist der code um die Zeilen in Frage, spielen eine große Rolle in, wie der compiler optimiert das segment.
Mit jemand anderes Beispiel auf diese Frage:
Mit gcc (nicht, dass große einen compiler) erhalten Sie:
Also beide Zeilen C-code verbunden sind, in einem Speicher, das problem hier ist das Beispiel verwendet als test. Zwei separate Funktionen, die hätte ein wenig besser, aber es braucht sehr viel mehr code um ihn herum, und der Zeiger muss auf einem anderen Speicher, so dass der optimizer nicht erkennen, es ist eine statische global-Adresse, um dies zu testen, müssen Sie übergeben Sie die Adresse so ein, dass die compiler (auch gcc) kann nicht herausfinden, dass es eine statische Adresse.
Oder ohne Optimierungen, gleicher code, gleiche compiler kein Unterschied zwischen pointer und direkter.
Dies ist was Sie erwarten würden, um zu sehen, abhängig vom compiler und Prozessor kann es keinen Unterschied. Für diesen Prozessor, selbst wenn der test-code versteckte die statische Adresse für den Zeiger von der Funktion wäre es immer noch einkochen, um zwei Anweisungen. Wenn der Wert gespeichert, in dem Strukturelement bereits einmal geladen wurden, in einem register, dann wäre es ein Befehl oder so, pointer oder direkt.
Also die Antwort auf deine Frage ist absolut nicht...es hängt davon ab. zerlegen und testen.
Ich nehme an, dass, wenn dies einen Unterschied macht, dass wäre von der Architektur abhängig.
Im Allgemeinen den Zugriff auf die struct direkt schneller wäre, da es nicht erfordern eine zusätzliche Zeiger dereferenzieren. Die Zeiger-Dereferenzierung bedeutet, dass Sie nehmen Sie den Zeiger (das Ding in der variable), laden was auch immer es Punkte zu, arbeiten Sie dann auf es.
In C, es sollte kein Unterschied sein, oder eine schlechte Leistung Treffer.
C Schüler unterrichtet werden:
Sollten Sie in der Lage sein zu vergleichen, die Demontage der beiden, sich davon zu überzeugen, dass Sie im wesentlichen die gleichen, auch wenn Sie nicht eine Assembly-code-Programmierer.
Wenn Sie sich für eine performance-Optimierung, würde ich woanders suchen. Sie werden nicht in der Lage zu speichern, genügend CPU-Zyklen, die mit dieser Art von Mikro-Optimierung.
Zur stilistischen Gründen bevorzuge ich die Struktur, die Punkt-notation, vor allem beim Umgang mit singleton-globals. Ich finde es wesentlich übersichtlicher zu Lesen.
Direkte member-Zugang ist schneller (für Hinweise, die Sie bekommen würde, einen Zeiger zu dereferenzieren Betrieb mehr, in der Regel). Obwohl ich habe eine harte Zeit vorzustellen, es in einer situation, wo wäre es ein problem, Leistung oder sonst.