Das ist etwas, worüber ich mich schon immer gewundert habe, aber ich habe mich nie um ein Profil bemüht.
Ist es effizienter, einer temporären Variablen einen Wert zuzuweisen, als diesen Wert weiter zu verwenden? Ein Beispiel kann klarer sein:
%Vor%ODER
%Vor%Mein erster Gedanke wäre, dass das obere Beispiel effizienter wäre, da es nicht auf die Item-Sammlung zugreifen oder ToString aufrufen muss.
Würde mich interessieren, die Ideen anderer Leute zu hören, oder eine definitive Antwort in beide Richtungen.
Der Compiler kann nicht wissen, ob der Ausdruck auf der rechten Seite Nebenwirkungen hat, also muss er ihn neu bewerten, wenn Sie ihn zweimal codieren. Daher ist das erste effizienter in dem Sinne, dass es das GetItem & amp; ToString-Aufrufe.
Wenn also der Programmierer weiß, dass diese Aufrufe rein / idempotent sind, dann sollten Sie den Code auf die erste Art schreiben.
Wie Brian sagte, der erste Weg wird effizienter, obwohl, ob es viel Unterschied in der realen Welt macht, hängt davon ab, wie teuer die doppelten Funktionen sind, und wie oft dieser Teil des Codes als Ganzes aufgerufen wird.
Allerdings ist der erste Weg nicht nur effizienter, sondern zeigt auch besser die Absicht an - dass Sie den beiden Dingen den gleichen Wert zuweisen wollen. Es hilft auch Wartbarkeit, denn wenn es ändern muss, müssen Sie nur an einem Ort ändern. Für mich sind beide typischerweise wichtiger als Effizienz.
Es gibt eine weitere Option - zusammengesetzte Zuweisung:
%Vor% Bei dieser Verwendung wertet der Compiler reader.GetItem[0].ToString()
einmal aus und verwendet sie, um sie beiden Mitgliedern zuzuweisen (tut nicht verwendet get
von someClass
). Dies geschieht durch Duplizieren des Werts auf dem Stack (der kein explizites Local benötigt).
Sehr effizient, aber um ehrlich zu sein würde ich mich nicht über das Original mit einer Variable freuen.
Nun, vorausgesetzt, dass die ToString
-Funktion nicht nur einen Verweis auf ein vorgefertigtes internes Objekt ausgibt, muss es ziemlich klar sein, dass die erste Version, bei der nur ein Aufruf gemacht wird, am schnellsten ist. Wenn dies jedoch ein Leistungsproblem ist, das Sie beachten sollten oder nicht, ist das eine völlig andere Geschichte.
Ein Problem bei do ist jedoch, dass das zweite Beispiel in der ersten und zweiten Zeile möglicherweise unterschiedliche Ergebnisse liefert, wenn auf das Element gleichzeitig von einem anderen Thread zugegriffen wird.
Ich habe nur die Gewohnheit, einen Wert in einer lokalen Variablen zu speichern, wenn ich ihn mehr als einmal verwende. In der Regel liegt es jedoch daran, dass ich die Kompaktheit des Codes bevorzuge und nicht zu sehr auf Effizienz bedacht bin - obwohl ich es definitiv tun würde, wenn ich es wiederholt in einer Schleife verwende.
Manchmal bin ich inkonsistent und werde nur neu eingeben, besonders wenn ich nur einen Accessor verwende und keine Methode aufruft, die eine Berechnung erfordert.
Hier ist meine Faustregel. Im Zweifelsfall profile deinen Code . Ein optimierender Compiler kann eine Menge Code entfernen, wodurch der Code schneller ausgeführt wird.
Zwei Fakten müssen ebenfalls berücksichtigt werden:
Dies bedeutet, dass Ihr Code unter einer oberflächlichen Beobachtung sehr schnell sein kann, aber wenn Sie viel Müll erzeugen, wird die Leistung Ihres Programms leiden, wenn es eine Weile läuft.
Lesbarkeit ist wichtig. Was ist die Verwendung von "s" benannter Variable?
Anstelle von [0] wird auch ein Feldname sinnvoller.
Es gibt noch andere Punkte, die zu beachten sind. Wenn die Verwendung von s
, die anderen Variablen zugewiesen wird, von der Stelle getrennt wird, an der s
durch mehr als ein paar Codezeilen initialisiert wird, öffnen Sie die Möglichkeit, dass jemand anderes später Code hinzufügt, der den Wert ändert von s
zwischen seinen Verwendungen oder verzweigt sich irgendwie um die ursprüngliche Zuweisung zu s
.
Eine Sache, die ich oft sehe, ist die Zuweisung einer Funktionsrückgabe an eine Variable, selbst wenn dieser Wert nur an einer Stelle verwendet wird, und ich hasse das, weil (und es spielt keine Rolle, wie diese Variable benannt ist ) Das führt unweigerlich dazu, dass man herausfinden muss, wo diese Variable zugewiesen wurde, um zu wissen, was sie wirklich repräsentiert. Wenn Sie den Rückgabewert der Funktion direkt der Verwendung zuweisen, zeigt dies explizit an, was vor sich geht.
Es gibt eine Fraktion in der Programmierung, die an "variable-lose Programmierung" glaubt (im Geschmack des berühmten "goto-less Programming" -Papiers vor Jahrzehnten). Zum Beispiel, XSL, während es "Variablen" hat, sind sie nicht nach ihrer ursprünglichen Zuordnung innerhalb eines einzelnen Bereichs änderbar. Dies, sagen manche, ist, was hilft, keine unbeabsichtigten Nebenwirkungen zu garantieren.
Tags und Links .net performance