2010-11-22 18 views
3

Ich frage mich: was in Bezug auf die Leistung zwischen den zwei Versionen der beste Anweisung ist:ternäre Operator imbrication

Background = Application.Current.Resources[condition ? BackgroundName1 : BackgroundName2] as Brush; 

und:

Background = condition ? Application.Current.Resources[BackgroundName1] as Brush : Application.Current.Resources[BackgroundName2] as Brush; 

gibt es einen Unterschied? und wenn ja, welche ist besser?

dank

NB: BackgroundName1 & 2 sind einfach

auch immer
+3

Haben Sie sich die IL angesehen? Der erste ist leichter zu lesen, der alle anderen Bedenken überwiegt, aber "Funktioniert es?" MEINER BESCHEIDENEN MEINUNG NACH. – annakata

+0

Verwenden Sie, was einfacher zu lesen und zu warten ist. – PetPaulsen

+8

Es spielt keine Rolle. Wenn Sie ein Leistungsproblem haben, wird das nicht die Codezeile sein, die es verursacht; Wenn Sie kein Problem haben, ist eine vorzeitige Optimierung eine Sorge. –

Antwort

5

Die erste ist kürzer und besser lesbar.

Es ist auch einfacher zu pflegen.
Wenn Sie es später ändern, um ein anderes Ressourcenwörterbuch zu lesen, vergessen Sie möglicherweise, die zweite Hälfte des zweiten zu ändern.

Die erste liest auch deutlicher aus dem gleichen Wörterbuch.

+0

danke. Ich habe Performance-Probleme, obwohl ich nicht wirklich davon überzeugt war, dass ich diese Zeile optimieren musste, aber nur aus Neugier ... – David

0

Kein Unterschied Saiten.

2

Lassen Sie sich nicht von Mikrooptimierungen mitreißen! Der Leistungsgewinn, den Sie erhalten, ist null. Gehen Sie für den Code, der am Ende lesbarer und einfacher zu verstehen ist.

3

Erstens: Verwenden Sie einen Profiler, um die langsamste Sache zu finden. Wenn Sie ein Performance-Problem haben, macht es keinen Sinn, Stunden oder Tage damit zu verbringen, etwas schneller zu machen, das bereits schnell genug ist.

Zweitens: Sie können die Antwort auf Ihre Frage ermitteln, indem Sie beide Wege ausprobieren und sorgfältig messen, um zu sehen, ob es einen Unterschied gibt. Frag uns nicht, was schneller ist; wir wissen es nicht, weil wir es nicht ausprobiert haben und es nicht versuchen können.

+0

Eigentlich bin ich mir ziemlich sicher, dass sie _identity_ ausführen werden. In beiden Fällen wird ein Cast, Dictionary-Lookup und Property Getter durchgeführt. Wenn er keine bösen Nebenwirkungen hat, wird es überhaupt keinen Unterschied geben. – SLaks

+2

@SLaks: Ich bin mir ziemlich sicher, dass du recht hast. Wie mein alter Entwickler sagte: "Bist du sicher genug, dass du dein Auto darauf wetten würdest?" Wenn ich über die Jahre eine Sache über Leistung gelernt habe, ist es manchmal so, dass die Leistung eines komplexen Systems zutiefst kontraintuitiv ist. Zum Beispiel haben wir kürzlich ein System eingestellt, das auf den Sammlungsdruck beschränkt war und entdeckt, dass, wenn wir eine große Anzahl von Zuweisungen weggenommen haben, das Programm * langsamer * geworden ist. Diese Zuteilungen haben zufällig gerade einige andere Blöcke auf die richtige Weise ausgerichtet ... –

+0

Ja. [Hier ein weiteres Beispiel] (http://stackoverflow.com/questions/3046805/why-is-dictionary-first-so-slow). – SLaks

Verwandte Themen