返与RelativeResource?
-
29-09-2019 - |
题
什么样的以下下面是更新后的数据模板'绑定的费用更多的性能:
<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
:- 可能会搜索和比较目前的元素更多的控制,通过其所有的儿童、兄弟姐妹、叔叔大叔叔包括的祖先(也许有一个HashTable的所有注册名称?)
- 得到一个
Name
财产的控制的成本应该较少的性能比打电话GetType
. - 比较一串是便宜比较的类型,尤其当你知道,大部分的控制甚至没有他们的
Name
设置。
FindAncestor
:- 只会迭代通过的祖先,不siblingls'叔叔','的表兄弟'等等。
- 最有可能的使用
GetType
确定祖先的类型;GetType费用更多的性能那么简单Name
酒店吸气(也许DPs是不同的?)
解决方案
它通常是一个可怕的想法试图回答这样的事情的争论,你认为会更快。迄今为止最好的构建一个试验测量它。
我修改了设置一点-我把相关的部署一个用户控件,并开的 Name
因为酒店 UserControl
没有一个 Title
财产。然后我写了一些代码,以创建一个新的实例,控制并将其添加到用户界面,使用的 Stopwatch
要测量的时间采取建造和装载它。(我开始时只是之前建造的用户控制,并停止之后的用户控制提出了它的 Loaded
事件。)
我运行这个代码 DispatcherTimer
20倍的第二个这样我就可以采取很多次测量,希望降低了试验性的错误。尽量减少扭曲,由于调试和诊断代码,我在运行中释放的建立,我只计算和打印本平均在2000年之后的迭代,已经完成。
2000年之后的迭代, ElementName
方法平均887us.
2000年之后的迭代, RelativeSource
方法平均959us.
所以 ElementName
是的,在这种特定实验,稍微快 RelativeSource
.加载一个微不足道的 UserControl
只有一个 Grid
和一个 TextBlock
其中只有一个命名的元素, ElementName
方法看起来采取92%的时间负载 RelativeSource
方法需要。
当然,我是测量一个小的,人工的例子在这里。性能返的方法可能有所不同的基础上有多少名为因素的范围。并且可能有其他未预料到的因素可能会产生完全不同的结果真实情况。因此,我建议执行类似的测量方面的真正应用程序,如果你想获得一个更好的图片。
我重复的实验10下面是更新后的数据模板而不是1。 ElementName
然后取平均值而2020us RelativeSource
方法平均2073us,再次超过2000年的迭代对这两种测试。古怪,有一个较小的区别在这里,不仅仅是相对而言的,但在绝对条件的一种元素例子显示出有差别的72us,其中十件的例子显示出有差别的53us.
我开始怀疑我是导致更多的变化,通过运行我测试我的主要机,而不是一个仔细配置点的东西,因为可能,尽量减少噪音。
一个更多的变化:仍有10往的文本块,我加十多个空,未结合,名为文本的用户控制。这里的想法是介绍更多的命名的东西- ElementName
现在已经找到一个名为项目内的11名东西。平均为 ElementName
现在是2775us.的 RelativeSource
方法与这些额外的10名为的要素是在3041us.
再次,我怀疑可变性,在我的桌面计算机在这里-这似乎奇怪, RelativeSource
已经进行的显着恶化,这里比在方案中应更多 ElementName
's优势。
无论如何,什么样的 做 似乎相当清楚的是,成本装在这里是远远更多的敏感元素的数量比哪式的结合使用。那里显然是一个小小的优势 ElementName
但足够小的(和足够怪异的结果),怀疑有效性的结论,它必然是更快。
所以我们可以建造更多的小心实验得到一个更好的图片。但在我看来,如果你不能最终证明一个显着的差异,在性能上运行时,普通计算机,然后它基本上是一个浪费时间争论这是更快。
因此,在结论:性能是错误的事情要重点在这里。为了使更多的读码。
其他提示
两者中的后期需要走视觉树寻找特定的祖先类型,因为先前的人直接向带有该名称的注册对象的窗口的名称示例...我的猜测是较晚的较慢...就是说,我认为不会有显着的性能差异。
希望能帮助到你,
AJ