was ist schneller: i=i+2 oder i+=2?
Betrachten Sie das folgende code-snippet:
for(i=0;i<10;i+=2) //1
for(i=0;i<2;i=i+2) //2
Welches wird besser zu nutzen?
Macht es einen Unterschied in der Leistung?
- Haben Sie versucht, timing? Was haben Sie herausgefunden?
- Die zweite wird schneller sein, da der gebunden ist, ist unterschiedlich.
- könnten Sie das genauer erklären? Sie bedeutete das 2 vs 10?
- Ich nahm an, dass die Grammatik-Regeln berechnen, die direkt i=i+2 und müssen einen übergang für i+=2, so würde ich sagen, ich=ich+2 ist schneller, aber nicht sicher, ob es die richtige Erklärung ...
- Mit jeder halbwegs gute compiler, die Schrittweite wird die gleiche Geschwindigkeit so oder so (d.h.,
x+=n;
undx=x+n;
produzieren identischen code). Es könnte eine Ausnahme sein, wenn Sie definiert die variable alsvolatile
, aber das ist ausreichend ungewöhnlich, dass es kaum lohnt, zu diskutieren. - Meinst du das wirklich so vergleichen Sie zwei Schleifen mit verschiedenen oberen Grenzen? So oder so, es ist vielleicht besser, editieren Sie entweder die Frage oder erwähnt diese Absicht ausdrücklich.
- Lassen Sie mich noch einmal link zu dieses Beispiel, wo 10+ Zeilen code Ergebnis in 5 Maschine Anweisungen. Nicht Geige mit low-level-Optimierungen, die der compiler ist viel besser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt keine definitive Antwort auf Ihre Frage. Es hängt davon ab, wie schlau dein compiler ist unter anderem (Optimierung, ...) und auf der Ziel-Plattform. Dies ist nicht eine C-Sprache in Frage. Die Sprache ist nicht mehr oder weniger performant von selbst. Es kommt nur darauf an, was der compiler baut aus ihm heraus. Also testen Sie es für Ihren Fall, wenn die Leistung überhaupt eine Rolle spielt...
Ansonsten mein Rat, nur schreiben Sie es in die Art und Weise Sie das Gefühl es mehr lesbar ist.
Den folgenden nahm 0.0260015 Sekunden
Und dieser nahm 0.0170010
@MasterID stimmt allerdings, wenn ich aktiv "optimize code" berichteten 0.0150009 Sekunden
Die erste option ist schneller als der zweite, mindestens.
Obwohl jede Zusammenstellung Optimierung erzeugt die gleichen Assembler-code.
Sowohl express-als die exakt gleiche Semantik, d.h. genau die gleiche Wirkung, die in der abstrakten Maschine der C-Sprache. Wenn man langsamer als die anderen, es ist eine quality-of-Implementierung Fehler in Ihrem compiler.
myPORT |= 1
mit einem einzigen read-modify-write Anweisung, aber der ProzessmyPORT = myPORT | 1;
über separate lese-und schreib-Operationen auf die Möglichkeit, dass der code möglicherweise müssen letztere Semantik für einige Grund, und das wäre der natürlichste Weg, um Sie zu bitten.volatile
Objekte sind als "Implementation Defined", und ich bezweifle wirklich die Autoren des Standard vorgesehen zu verbieten Implementierungen angeben, dass bestimmte zusammengesetzte Zuweisung Ausdrücke verarbeitet werden, die in spezifischer Weise. Der Ort, dieses Problem ist auf Systemen, die eine Zuordnung einer Adresse zwei Register, und Prozess "stand-alone" - Lesen Sie die Anweisungen, wie der Zugriff auf und beide schreiben und Lesen-ändern-schreiben Anweisungen, wie der Zugriff auf die anderen. Ich mag solche designs, aber einige chips funktionieren auf diese Weise.union { uint16_t h[4]; uint32_t w[2];} u;
gcc erkennt, dassu.h[i]
könnte Zugriff auf den gleichen Speicher wieu.w[j]
, aber es wird nicht erkannt, dass*(u.h+i)
könnte Zugriff auf den gleichen Speicher wie*(u.w+j)
. Wenn der Standard sagt, dass zwei Konstrukte äquivalent sind, bedeutet dies, dass alle Anforderungen, die es auferlegt, einen für die anderen, und sagt nichts über das Verhalten, das Sie liefern kann, über diejenigen hinaus, die die Norm erforderlich sind.