Deklarieren Sie eine variable, die innerhalb oder außerhalb einer foreach-Schleife: welche ist schneller/besser?
Welche der beiden ist schneller/besser?
Diese:
List<User> list = new List<User>();
User u;
foreach (string s in l)
{
u = new User();
u.Name = s;
list.Add(u);
}
Oder dieses:
List<User> list = new List<User>();
foreach (string s in l)
{
User u = new User();
u.Name = s;
list.Add(u);
}
Meine newbie-Entwicklung von Fähigkeiten sagt mir, das erste ist besser, aber ein Freund von mir sagt mir im falschen, aber könnte nicht gib mir einen guten Grund, warum die zweite besser ist.
Ist, gibt es einen Unterschied in der Leistung?
InformationsquelleAutor Marcus | 2009-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leistungsmäßig beide Beispiele sind zusammengestellt, um die gleiche IL, so gibt es keinen Unterschied.
Die zweite ist besser, da es deutlicher drückt Ihre Absicht, wenn
u
ist nur innerhalb der Schleife.Können Sie erklären, warum beide sind zusammengestellt, um die gleiche IL? Ich bin mir ziemlich sicher, dass C# nicht hissen Variablen-Deklaration bis an den Anfang der Funktion wie javascript funktioniert.
hier ist die Antwort zu Ihrer Frage.
Folgende Stack-Überlauf links liefern ausführliche Antworten: 1) Jon Hanna und 2) StriplingWarrior
InformationsquelleAutor dtb
In jedem Fall der beste Weg wäre, um einen Konstruktor, einen Namen... oder sonst verwerten geschweifte-Klammer-notation:
oder
oder noch besser, LINQ:
Jetzt, während deiner ersten Beispiel konnte in einigen Fällen werden unperceptibly schneller, die zweite ist besser, weil es besser lesbar, und der compiler kann abwerfen, die variable (und lassen es ganz aus), da es nicht verwendet outsid die
foreach
's scope.Kaum. Mit der LINQ-version weiß ich, dass das, was ich Tue, ist unveränderlich, und es funktioniert über jedes element.
InformationsquelleAutor Tordek
Erklärung nicht zu jedem code ausgeführt werden kann, so ist es nicht ein performance-Problem.
Das zweite ist, was du meinst, und Sie sind weniger wahrscheinlich, um einen dummen Fehler, wenn Sie sich für die zweite Möglichkeit, so dass die Verwendung. Versuchen Sie immer, um Variablen zu deklarieren, die in den kleinsten Bereich notwendig.
Und außerdem der bessere Weg ist die Verwendung von Linq:
InformationsquelleAutor Mark Byers
Wenn du hast eine Frage, über die Leistung, das einzige, was zu tun ist, Messen - führen Sie eine Schleife um Ihre test-und Zeit.
Ihre Frage zu beantworten - ohne Messen 🙂 oder ein Blick auf das generierte ilasm - einen Unterschied würde nicht auffallen in einer sinnvollen Anzahl an Iterationen und die teuerste operation in deinem code dürfte es sein, die Zuordnung von ein paar Größenordnungen, so konzentrieren sich auf die code-Klarheit (als Sie sollten im Allgemeinen) und gehen Sie mit 2.
Oh, es ist spät und ich denke, ich versuche nur zu sagen, Mach dir keine sorgen über diese Art der Sache oder verfangen sich in details wie diese.
K
Wenn Sie möchten, weiter zu gehen mit dem Blick in das, was sich auf die Leistung auswirkt, sehen Sie in der Verwendung einer code-profiler. Wenn nichts sonst, wird es beginnen, um Ihnen eine Idee geben, welche Art von code und Operationen nehmen die meiste Zeit. ProfileSharp und EqatecProfilers sind kostenlos und ausreichend für den Einstieg.
InformationsquelleAutor Kevin Shea
Den 2. besser ist. Sie sind von Bedeutung, um einen neuen Benutzer in jeder iteration.
InformationsquelleAutor Jarrett Widman
Technisch das erste Beispiel, sparen ein paar Nanosekunden, weil der stack-Rahmen wird nicht bewegt werden, weisen Sie eine neue variable, aber dies ist ein so winziger Betrag an CPU-Zeit, Sie wird es nicht bemerken, dass, wenn der compiler nicht optimieren jeder Unterschied Weg anyays.
Auch kann der compiler gut optimieren, dass Weg, aber stack-Speicher allokiert werden für alle Variablen in einer Schleife. Dies wäre die Umsetzung abhängig und man kann die implementation halten Sie einfach die stack-Frames die gleiche, während ein anderer (sprich Mono) könnte lassen Sie die Stapel dann erneut auf jeder Schleife.
Alle lokalen Variablen in einer Methode (top-level-oder verschachtelt in einer Schleife) kompiliert werden Methode-level-Variablen in IL. Der Speicherplatz für die Variablen reserviert ist, bevor die Methode ausgeführt wird, nicht, wenn ein Zweig mit der Deklaration in C# erreicht ist.
Haben Sie eine Quelle für diese Behauptung?
InformationsquelleAutor Erik Funkenbusch
In diesem Szenario wird die zweite version besser ist.
Im Allgemeinen, wenn Sie nur brauchen, um den Wert zuzugreifen, der innerhalb des Körpers der iteration, dann wählen Sie die zweite version. Auf der anderen Seite, wenn es einen finalen Zustand, die variable wird halten über den Körper der Schleife, dann erklären, dann verwenden Sie die erste version.
InformationsquelleAutor csj
Sollte es keine percievable Unterschied in der Leistung.
InformationsquelleAutor Jacob Adams
Andere Referenz, die aussieht wie oben:
http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/d43aaba5-a58b-4610-bea4-5bc5d6741f98
InformationsquelleAutor Sunil