ElementName vs. RelativerSource?
-
29-09-2019 - |
質問
次のTextBlocksのバインディングのコストが増えます:
<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>
テキストブロックが多くの兄弟や祖先を持つ高いネスティングレベルにある場合、私の質問が異なるかもしれないと確信しています。
考慮事項
(個人的な考えのみに基づいて、私はそれぞれの特定のもので間違っているかもしれません!):
ElementName
:- 現在の要素をより多くのコントロールと比較して比較し、すべての子供、兄弟、叔父、祖先を含む偉大な叔父を通して(登録されたすべての名前のハッシュテーブルがあるかもしれませんか?)
- 取得
Name
コントロールのプロパティは、呼び出すよりもパフォーマンスが低いはずですGetType
. - 文字列を比較することは、タイプを比較するよりも安価です。特に、ほとんどのコントロールにさえ持っていないことがわかっている場合は、
Name
セットする。
FindAncestor
:- 兄弟の「叔父」、「いとこ」などではなく、先祖のみを繰り返します。
- おそらく使用します
GetType
祖先タイプを決定する。 getTypeは、単純なパフォーマンスよりもパフォーマンスが高くなりますName
プロパティゲッター(たぶんDPSは違うのでしょうか?)
解決
通常、あなたがどちらがより速くなると思うかについて議論することによって、この種のことに答えようとするのはひどい考えです。それを測定するための実験を構築する方がはるかに良いです。
私はあなたのセットアップを少し変更しました - 私は関連するXAMLをusercontrolに入れ、 Name
それ以来 UserControl
持っていません Title
財産。次に、いくつかのコードを作成してコントロールの新しいインスタンスを作成し、UIに追加し、 Stopwatch
構築してロードするのにかかった時間を測定するため。 (ユーザーコントロールを構築する直前にタイミングを開始し、ユーザーコントロールが上昇した直後に停止します Loaded
イベント。)
このコードをaから実行します DispatcherTimer
1秒に20回、実験エラーを減らすことを期待して多くの測定を行うことができます。デバッグと診断コードによる歪みを最小限に抑えるために、私はリリースビルドで実行されています。2000回の反復が完了した後にのみ、平均を計算して印刷します。
2000回の反復後、 ElementName
アプローチは平均887USです。
2000回の反復後、 RelativeSource
アプローチは平均959USです。
それで ElementName
この特定の実験では、 RelativeSource
. 。些細なことをロードします UserControl
ただ Grid
そして1つ TextBlock
名前付き要素は1つだけです ElementName
アプローチは、それをロードするのに92%の時間がかかるように見えます RelativeSource
アプローチが必要です。
もちろん、ここでは小さな人工的な例を測定しています。 ElementNameアプローチのパフォーマンスは、範囲内にある名前の要素の数によって異なる場合があります。また、実際のシナリオでまったく異なる結果を生み出す可能性のある他の予期しない要因があるかもしれません。そのため、より良い写真を撮りたい場合は、実際のアプリケーションのコンテキストで同様の測定を実行することをお勧めします。
1ではなく10個のテキストブロックで実験を繰り返しました。 ElementName
その後、平均2020USを獲得しました RelativeSource
アプローチは平均2073USで、再び両方のテストで2000回以上の反復でした。奇妙なことに、ここでは相対的な用語だけでなく、絶対的な用語では小さな違いがあります。1つの要素の例は72Uの違いを示し、10個の要素の例は53Uの違いを示しました。
メインマシンでテストを実行することで、できるだけ少ないもので慎重に構成されているものではなく、ノイズを最小限に抑えることで、より多くの変動を引き起こしていると疑っています。
もう1つのバリエーション:まだ10のバインドされたテキストブロックがあるため、ユーザーコントロールに10個の空の、アンバウンド、名前付きのテキストブロックを追加しました。ここでのアイデアは、より多くの名前のものを紹介することでした - ElementName
次に、11の名前の項目内に名前が付けられたアイテムを見つける必要があります。の平均 ElementName
現在2775USです。 RelativeSource
これらの余分な10の名前の要素を使用してアプローチは3041USで発表されました。
繰り返しますが、ここのデスクトップマシンの変動性があると思われます - 奇妙に思えます RelativeSource
ここでは、より多くのシナリオよりも著しく悪化しています。 ElementName
の利点。
とにかく、何 します かなり明確に思えます。ここでの読み込みコストは、使用するスタイルのスタイルよりも、要素の数に対してはるかに敏感であることです。明らかに小さな利点があります ElementName
しかし、それが必然的により速いと結論付けるという妥当性に疑いを抱くのに十分なほど小さい(そして奇妙な結果があります)。
そのため、より良い写真を撮るために、より慎重な実験を構築できます。しかし、私の見解では、通常のコンピューターで実行する際にパフォーマンスの大きな違いを最終的に実証できない場合、基本的にはどちらがより速いかについての時間の無駄です。
結論として:パフォーマンスはここで焦点を合わせるのが間違っています。より読みやすいコードを作成するものを選択してください。
他のヒント
後の2つは、特定の祖先タイプを探してビジュアルツリーを歩く必要があります。事前には、その名前の登録されたオブジェクトのウィンドウの名前スコープに直接見えるように...私の推測は後の方がわずかです...とはいえ、パフォーマンスの大きな違いがあるとは思わない。
それが役に立てば幸い、
AJ