2009-06-01 3 views
0

Wird es einen großen Unterschied in der Leistung zwischen sein:Leistungsdifferenz in Looping

if (this.chkSelectAll.Checked) 
    for (int i = 0; i < this.listBoxColumns.Items.Count; i++) 
     this.listBoxColumns.SetSelected(i, true); 
else 
    for (int i = 0; i < this.listBoxColumns.Items.Count; i++) 
     this.listBoxColumns.SetSelected(i, false); 

gegen

for (int i = 0; i < this.listBoxColumns.Items.Count; i++) 
    this.listBoxColumns.SetSelected(i, this.chkSelectAll.Checked); 

Welches ratsam ist. Konzise Kodierung vs. Leistungssteigerung?

+0

Ich bekomme die Frage nicht. Was fragst du? Warum schreibe ich die längere Version? Welchen Vorteil hat die längere Version Ihrer Meinung nach? Bitte aktualisieren Sie Ihre Frage mit dem, was Sie für gut und schlecht für jede Version halten. –

Antwort

10

Ich würde nicht erwarten, viel Leistungsunterschied zu sehen, und ich würde sicherlich mit letzterem gehen, da es lesbarer ist. (Ich würde Klammern aber darum herum legen.)

Es ist ziemlich einfach, sich eine Situation vorzustellen, in der Sie möglicherweise die Schleife ändern müssen, und mit dem ersten Beispiel könnten Sie versehentlich nur eine von ihnen anstelle von beiden ändern. Wenn Sie wirklich Aufruf der Checked Eigenschaft in jeder Iteration vermeiden möchten, können Sie immer tun:

bool checked = this.chkSelectAll.Checked; 
for (int i = 0; i < this.listBoxColumns.Items.Count; i++) 
{ 
    this.listBoxColumns.SetSelected(i, checked); 
} 

Wie immer schreiben die meisten lesbaren Code zuerst, und Mess-/Profil keine Leistungsunterschiede vor Ihrem Design Biegen/Code aus Gründen der Leistung aus der Form.

1

Sie haben eine zusätzliche boolesche Überprüfung im ersten Beispiel. Aber ich kann mir nicht vorstellen, dass der Leistungsunterschied etwas anderes als vernachlässigbar ist. Haben Sie versucht, dies in Ihrem speziellen Szenario zu messen?

Das zweite Beispiel ist vorzuziehen, da Sie den Schleifencode nicht wiederholen.

0

Warum System.Diagnostics.StopWatch nicht verwenden und die beiden selbst vergleichen? Ich glaube jedoch nicht, dass es einen wirklichen Leistungsunterschied geben wird. Das erste Beispiel ist möglicherweise schneller, weil Sie nur einmal auf chkSelectAll.Checked zugreifen. Beide sind jedoch leicht lesbar.

1

Ich kann nicht sehen, dass es einen signifikanten Leistungsunterschied zwischen den beiden gibt. Der Weg, dies zu bestätigen, wäre, einen Benchmark zu erstellen und die verschiedenen Algorithmen über 1000 Iterationen zu synchronisieren.

Wie auch immer es UI-Code ist, ist jede Leistungssteigerung ziemlich bedeutungslos, da Sie darauf warten, dass der Benutzer den Dialog liest und entscheidet, was als nächstes zu tun ist.

Persönlich würde ich jedes Mal für den zweiten Ansatz gehen. Sie müssen nur eine Schleife pflegen und der Code ist klarer.

1

Alle Leistungsunterschiede sind vernachlässigbar.

Ihr Hauptanliegen sollte die Lesbarkeit und Wartbarkeit des Codes sein.

Mikro-Optimierungen wie diese sind häufiger, fehl am Platz. Profilieren Sie immer, bevor Sie sich mit der Leistung befassen.

1

Es ist am wahrscheinlichsten vernachlässigbar. Noch wichtiger ist jedoch, habe ich das Bedürfnis folgende zu zitieren:

"Premature optimisation is the root of all evil"

Der zweite ist einfach das besser lesbar, so einfach gehen mit, dass, wenn Sie später eine Notwendigkeit für Sie zu optimieren (was meiner Meinung nach ziemlich unwahrscheinlich ist).

2

Ich nehme an, der Leistungsunterschied wird kaum wahrnehmbar sein. Aber hier ist eine Variante, die sowohl effizient und sehr gut lesbar ist:

bool isChecked = this.chkSelectAll.Checked; 
for (int i = 0; i < this.listBoxColumns.Items.Count; i++) { 
    this.listBoxColumns.SetSelected(i, isChecked); 
} 

Wenn Sie sind nach einigen echten Optimierung Sie auch darauf achten, werden Sie wollen, ob die Overhead „this.listBoxColumns“ zweimal bei jeder Iteration des Zugriffs ist an erster Stelle und ist es wert, darauf zu achten. Dafür ist Profiling zuständig.