Frage

Was ist mit den folgenden Textblocks Bindings kostet mehr Leistung:

<Window  
  x:Name="Me"
  x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  xmlns:src="clr-namespace:WpfApplication1" 
  Title="MainWindow">
  <StackPanel>
    <TextBlock Text="{Binding Title, ElementName=Me}"/>
    <TextBlock Text="{Binding Title, RelativeSource={RelativeSource AncestorType={x:Type src:MainWindow}}}"/>
  </StackPanel>    
</Window>

Ich bin sicher, dass meine Frage vielleicht anders nehmen, wenn die Textblocks in einem hohen Verschachtelungsebene sind viele Geschwister und Vorfahren haben.

Überlegungen

(basierend auf persönlichen Gedanken nur, ich könnte in jedem einzelnen ein falsch sein!):

  • ElementName :

    • suchen könnte und vergleichen, um mehr Steuerstrom Element, durch alle seine Kinder, Geschwister, Onkel und Großonkel einschließlich Vorfahren (vielleicht gibt es eine HashTable aller registrierten Namen?)
    • Erste ein Name Eigenschaft einer Kontrolle sollte weniger Leistung kosten als GetType aufrufen.
    • eine Zeichenfolge zu vergleichen ist billiger als Typen zu vergleichen, vor allem wenn man weiß, dass die meisten der Kontrollen haben nicht einmal ihren Name Satz.
  • FindAncestor :

    • Wird nur Iterierte durch Vorfahren, nicht siblingls 'Onkel', 'Cousins' etc.
    • Sehr wahrscheinlich Anwendungen GetType Vorfahrtyp zu bestimmen; GetType kostet mehr Leistung dann eine einfache Name Eigenschaft Getter (vielleicht DPs sind anders?)
War es hilfreich?

Lösung

Es ist in der Regel eine schreckliche Idee zu versuchen, diese Art der Sache zu beantworten, indem sie darüber zu streiten, welche denken Sie schneller sein wird. Weit besser, ein Experiment zu konstruieren, sie zu messen.

Ich änderte das Setup ein wenig - Ich habe die entsprechende XAML in einem Usercontrol, und an die Name Eigenschaft gebunden, da UserControl keine Title Eigenschaft. Ich schrieb dann einen Code eine neue Instanz der Steuerung zu erstellen und an die Benutzeroberfläche hinzufügen und verwendet, um den Stopwatch die Zeit Konstrukt genommen zu messen und laden. (Ich kann das Timing beginnen kurz vor dem Benutzer die Kontrolle der Konstruktion, und ich höre nur, nachdem der Benutzer die Kontrolle erhöht seine Loaded Ereignis.)

ich diesen Code aus einem DispatcherTimer laufen 20 mal pro Sekunde, damit ich viele Messungen in der Hoffnung, der Verringerung des experimentellen Fehlers erfolgen kann. Um Störungen zu minimieren aufgrund Debuggen und Diagnose-Code, ich bin in einem Releasebuild ausgeführt wird, und ich nur berechnen und drucken Sie die durchschnittliche nach 2000 Iterationen abgeschlossen haben.

Nach 2000 Iterationen, die ElementName Ansatz mittelt 887us.

Nach 2000 Iterationen, die RelativeSource Ansatz mittelt 959us.

So ElementName ist, in diesem speziellen Experiment, etwas schneller als RelativeSource. Laden eines trivialen UserControl mit nur Grid und ein TextBlock, wo es nur ein benanntes Element, sieht die ElementName Ansatz 92% der Zeit zu Last zu tragen, dass die RelativeSource Ansatz nimmt.

Natürlich, ich bin Messung ein kleines, künstliches Beispiels hier. Die Leistung des Element Ansatzes könnte variieren je nachdem, wie viele genannten Elemente in ihrem Umfang. Und vielleicht gibt es andere unvorhergesehene Faktoren, die völlig unterschiedliche Ergebnisse in realen Szenarien erzeugen könnten. So würde ich empfehlen, ähnliche Messungen im Rahmen einer realen Anwendung durchführen, wenn Sie ein besseres Bild erhalten möchten.

wiederholte ich das Experiment mit 10 Textblöcken statt 1 ElementName dann gemittelt 2020us während des RelativeSource Ansatz 2073us gemittelt, wieder über 2000 Iterationen für beiden Tests. Seltsam, es gibt einen kleinen Unterschied, nicht nur relativ gesehen, aber in absoluten Zahlen -. Die einelementige Beispiele einen Unterschied von 72us zeigten, wo die zehn Elemente Beispiele einen Unterschied von 53us zeigten

Ich fange an zu vermuten, dass ich, indem Sie meine Tests auf meiner Hauptmaschine mehr Variabilität bin zu, anstatt ein sorgfältig konfigurierte, um mit so wenig Material wie möglich das Rauschen zu minimieren.

Eine weitere Variation: noch mit 10 gebundenen Textblöcken, fügte ich noch zehn leeren, ungebunden, mit dem Namen Textblocks auf die Benutzersteuerung. Die Idee hier war mehr mit dem Namen Dinge einzuführen - ElementName jetzt ein benanntes Element innerhalb von 11 genannten Dingen zu finden hat. Der Durchschnitt für ElementName ist jetzt 2775us. Der RelativeSource Ansatz mit diesen zusätzlichen 10 genannten Elementen kam bei 3041us aus.

Noch einmal, ich verdächtige Variabilität auf meinem Desktop-Rechner hier -. Scheint es seltsam, dass RelativeSource deutlich schlechter hier durchgeführt hat, als in dem Szenario, das zu ElementName des Vorteile gewesen mehr haben sollte

Wie auch immer, was hat scheint ziemlich klar ist, dass die Kosten für die Belastung hier ist viel empfindlicher auf die Anzahl der Elemente, als es zu dem ist Stil binden Sie verwenden. Es gibt offenbar einen kleinen Vorteil zu ElementName aber klein genug (und mit seltsam genug Ergebnissen), um gegossene Verdacht über die Gültigkeit der Schlussfolgerung gelangt, dass es unbedingt schneller ist.

So wir vorsichtige Experimente konstruieren könnten ein besseres Bild zu bekommen. Aber meiner Meinung nach, wenn Sie nicht abschließend einen signifikanten Unterschied in der Leistung zeigen können, wenn sie auf einem gewöhnlichen Computer ausgeführt wird, dann ist es im Grunde eine Verschwendung von Zeit darüber zu streiten, welche schneller ist.

Also abschließend: Leistung ist die falsche Sache auf ihn konzentrierenRe. Wählen Sie je nachdem, was für mehr lesbaren Code macht.

Andere Tipps

Die spätere der beiden Bedürfnisse die visuelle Struktur für einen bestimmten Vorfahren Typ suchen zu gehen, wo, wie nach dem Stand der Blicke direkt auf die Namescope Fenster für ein registriertes Objekt mit diesem Namen ... meine Vermutung die später wäre marginal langsamer ... das heißt, ich glaube nicht, dass es eine signifikante Performance-Unterschied sein.

Hope es hilft,

Aj

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top