2009-03-15 23 views
4

Ich möchte nur wissen, dass das Erstellen von lokalen Variablen, um den Rückgabewert der Funktion zu akzeptieren, die Speicherauslastung oder Leistung in .NET-Anwendungen, insbesondere in ASP.Net.Lokale Variablen in .Net erstellen

sagen

MyObject myObject = Foo(); 
MyOtherObject myOtherObject = Boo(); 

SomeFuntion(myObject, myOtherObject); 

ODER

Sollte ich

MyFunction(Foo(), Boo()); 

Gewiß ist die frühere Nutzung einer besseren Lesbarkeit verwenden hat .. Aber was ist mit der Speicherauslastung und Leistung?

Vielen Dank im Voraus 123Developer

+0

Ich finde tatsächlich die später perfekt lesbar und irgendwie bevorzugen es, wenn MyFunction nicht eine Tonne von Parametern hat. – Dana

Antwort

15

nicht optimieren vorzeitig; in einem Release-Build ist es sehr wahrscheinlich, dass der Compiler diese sowieso entfernt! So oder so, Sie sprechen nur ein wenig Stapelplatz für (vermutlich) ein paar Referenzen. Jeder Ansatz ist in Ordnung; gehe mit dem, was besser lesbar ist.

+0

Übereinstimmen. Außerdem müssten Sie eine solche Funktion ziemlich stark beanspruchen, um messbare Auswirkungen auf die Leistung zu haben. In einer ASP.NET-Anwendung sollten Sie sich zunächst darauf konzentrieren, was Sie mit ViewState und anderen über das Netzwerk gesendeten Daten tun. –

+0

Ich begrüße unsere neuen Compiler-Overlords. – Will

2

Ich glaube, die Speicherleistung wäre im Wesentlichen die gleiche. Wenn die Leistungsprüfung keinen signifikanten Unterschied aufweist, wählen Sie die Option mit verbesserter Lesbarkeit.

5

CIL (die Zwischensprache, in die C# kompiliert wird) ist eine stack-basierte Sprache, so dass die Rückgabewerte der Zwischenfunktionen auf dem Stack landen müssen, bevor sie als Argumente an die letzte übergeben werden.

Es gibt keine Möglichkeit vorherzusagen, was der C# -Compiler tun wird [1] in Bezug auf die Einheimischen; Es kann sich dazu entscheiden, Locals zu verwenden, oder Sie können das Stack-Verhalten verwenden und sie ganz überspringen. Genauso kann es Ortsansätze synthetisieren, auch wenn Sie sie nicht verwenden oder nicht.

In jedem Fall ist es nicht wichtig, sich über den Leistungsunterschied Gedanken zu machen.


[1] Ja, natürlich können Sie auf der IL kompilieren und schauen sie, um festzustellen produziert, was es tun wird, aber das ist für die aktuelle Version des Compilers nur gültig, Sie verwenden sind und ist ein Implementierungsdetail, auf das Sie sich nicht verlassen sollten.

+0

+1 für die Erwähnung der Stapelerstellung in jedem Fall. Perfekte Antwort IMO. –

0

Haben Sie keine Angst, lokale Variablen zu verwenden. Der Unterschied in der Speichernutzung und der Leistung ist sehr gering oder in einigen Fällen gar nicht vorhanden.

In Ihrem speziellen Fall können die lokalen Variablen 8 Byte (16 Byte in einer 64-Bit-Anwendung) Stapelspeicher verwenden. Der Compiler kann jedoch lokale Variablen selbst erstellen, wenn diese für die temporäre Speicherung benötigt werden. Daher ist es möglich, dass beide Versionen die gleichen lokalen Variablen haben.

Außerdem kann der Compiler für einige lokale Variablen Prozessorregister anstelle von Stapelspeicher verwenden, sodass es nicht einmal sicher ist, dass beim Erstellen einer lokalen Variablen überhaupt Stackspeicher verwendet wird.

Die Zuweisung von Stapelplatz ist sowieso sehr billig. Wenn die Methode aufgerufen wird, wird ein Stapelrahmen für die lokalen Daten in der Methode erstellt. Wenn mehr Speicher zugewiesen werden muss, ändert sich nur der Stapelzeiger, so dass kein zusätzlicher Code erzeugt wird.

Schreiben Sie einfach den Code so, dass er wartbar und robust ist, und vertrauen Sie dem Compiler, um die Verwendung der Variablen zu optimieren.