2013-06-18 24 views
10

Ich frage mich, ob dies einen Unterschied macht:Performance: List.Count vs eine gespeicherte Variable Überprüfung

for (int i = 0; i < values.Count; i++) 
     { 
      // 
     } 

vs

int num = values.Count; 

for(int=0; i<num; i++) 
{ 

} 

Ich denke, der zweite Ansatz besser ist, weil Sie nicht brauchen Zählen Sie alle Elemente in jeder Iteration. Aber ich kann mich irren. Konnte mich jemand erleuchten?

+6

Wenn Sie sich über die Leistung Gedanken machen, sollten Sie in der Regel Ihre App so profilieren, dass die Engpässe ermittelt werden. Moderne Compiler machen eine sehr gute Arbeit bei der Optimierung und die Engpässe sind normalerweise nicht dort, wo man denkt, dass sie es sind. Brian Kernighan beschreibt in "The Practice of Programming", wie selbst die sehr schlauen Leute bei Bell Labs das falsche Ding optimiert haben. – David

+3

Sie haben den Code in beide Richtungen geschrieben. ** Führen Sie es in beiden Richtungen und dann wissen Sie, welche schneller ist **. Nutze * science * um dieses Problem zu lösen, nicht * Divination *. –

Antwort

11

Die Liste speichert intern bereits Count. Der Vergleich, den Sie gerade machen, bezieht sich auf den Codestil, nicht auf die Leistung. Da der Compiler den Abruf von ‚Count‘ optimieren

+2

Es ist nicht möglich, dass der Compiler das Abrufen von "Count", einer veränderbaren Eigenschaft für ein anderes Objekt, optimiert. Meine Experimente mit optimierter IL zeigen an, dass "Count" bei jeder Iteration erneut gelesen wird. – spender

+0

@spender die IL kann durch das JIT umgewandelt werden, versuchen Sie, die optimierte Baugruppe zu lesen, die von JIT generiert wird, hier sind Anweisungen: http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807. aspx – Esailija

+0

Ich glaube nicht, dass das JIT clever genug ist, um eine Optimierung zu machen, die es erfordert zu wissen, ob die Liste von einem anderen Thread manipuliert wird. Das klingt für mich etwas teuer. Ich schaue mir die optimierte JIT-Baugruppe an, aber ich habe Mühe zu sehen, wie dies optimiert werden könnte. – spender

3

Dies hängt ganz davon ab, was values ist. Count könnte völlig anders implementiert werden, je nachdem, was der Typ dieses Objekts ist.

Wenn Sie von einem generischen List<T> sprechen - dann wird Count als interne Eigenschaft implementiert, die nicht neu ausgewertet wird - und daher die bessere Wahl ist.

8

Nun, Sie auf der .NET-Quellcode hier http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#aa7e01fcb80a917e

public int Count { 
     get { 
      Contract.Ensures(Contract.Result<int>() >= 0); 
      return _size; 
     } 
    } 

aussehen Es scheint, dass .Count Eigenschaft auf Liste tut eine schnelle interne Überprüfung und gibt dann _size zurück. Es sollte also ziemlich nah an der Leistung von Ihnen sein, den Wert selbst zu speichern.

+0

Ich habe über die Quelldokumente für diese +1 Dank gesucht – RadioSpace

Verwandte Themen