2010-03-17 85 views
18

我正在做一些基准测试,以确定我是否可以将WPF用于新产品。但是,早期绩效结果令人失望。我做了一个快速的应用程序,它使用数据绑定来每隔100毫秒在列表框中显示一堆随机文本,并且它占用了大约15%的CPU。所以我做了另一个快速的应用程序,它跳过了数据绑定/数据模板方案,并且每隔100 ms更新一个ListBox内的10个TextBlocks(实际产品不需要100 ms更新,更像500 ms,但最多不过这是一个压力测试)。我仍然看到〜5-10%的CPU使用率。为什么这么高?是因为所有的垃圾串?这是慢的WPF TextBlock性能预计?

下面是不使用绑定版本的XAML:

<Grid> 
    <ListBox x:Name="numericsListBox"> 
     <ListBox.Resources> 
      <Style TargetType="TextBlock"> 
       <Setter Property="FontSize" Value="48"/> 
       <Setter Property="Width" Value="300"/> 
      </Style> 
     </ListBox.Resources> 

     <TextBlock/> 
     <TextBlock/> 
     <TextBlock/> 
     <TextBlock/> 
     <TextBlock/> 
     <TextBlock/> 
     <TextBlock/> 
     <TextBlock/> 
     <TextBlock/> 
     <TextBlock/> 
    </ListBox> 
</Grid> 

这里是后面的代码:根据任务管理器

public partial class Window1 : Window 
{ 
    private int _count = 0; 

    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void OnLoad(object sender, RoutedEventArgs e) 
    { 
     var t = new DispatcherTimer(TimeSpan.FromSeconds(0.1), DispatcherPriority.Normal, UpdateNumerics, Dispatcher); 
     t.Start(); 
    } 

    private void UpdateNumerics(object sender, EventArgs e) 
    { 
     ++_count; 
     foreach (object textBlock in numericsListBox.Items) 
     { 
      var t = textBlock as TextBlock; 
      if (t != null) 
       t.Text = _count.ToString(); 
     } 
    } 
} 

消耗〜5-10%的CPU,或高达核心之一的约20%!任何想法更好的方式来快速呈现文字?

我的电脑:XP SP3,2.26 GHz Core 2 Duo,4 GB RAM,Intel 4500 HD集成显卡。这比我在真实产品中需要开发的硬件要强大一个数量级。

+0

在WPF绑定不完全是你的方式。 – 2010-03-17 19:22:17

+0

我没有发布使用绑定版本的代码(以及MVVM模式)。我认为这个版本的重量会更轻,这是一个更好的例子。 – 2010-03-17 19:28:08

+0

绝大多数CPU周期都应该在渲染时刻烧录。但是请使用探查器来确保。下面是你的*非常* poky图形硬件的回顾:http://pcgamingcorner.com/wordpress/?p=820 – 2010-03-17 19:42:23

回答

40

TextBlock性能是否正常?

不,这样慢的TextBlock性能是绝对不是正常的。我的经验是TextBlocks比这更快。

我使用您发布的代码运行了多个测试,保持0.1s的更新间隔,并改变了TextBlock的硬件和数量。以下是我发现:

10 TextBlocks, 2.16GHz Core 2 Duo, Radeon 4100 GPU:  CPU Usage "0%" 
10 TextBlocks, 2.16GHz Core 2 Duo, Software rendering: CPU Usage 1% 
100 TextBlocks, 2.16GHz Core 2 Duo, Radeon 4100 GPU:  CPU Usage 8% 
100 TextBlocks, 2.16GHz Core 2 Duo, Software rendering: CPU Usage 18% 
10 TextBlocks, 200MHz Pentium Pro, Software rendering: CPU Usage 35% 
10 TextBlocks, 200MHz Pentium Pro, No rendering:  CPU Usage 7% 

每一个这些测试表明,WPF是近10倍的速度作为测量结果表明。如果你的代码看起来很简单,那么我的怀疑就是你的GPU或者DirectX驱动有些奇怪的事情发生。

请注意,对于100个TextBlock测试,我必须进行三项更改:添加90个TextBlocks,将ItemsPanel设置为WrapPanel以获取列中的数据,并减小TextBlock宽度以使所有内容适合屏幕。

我对200MHz Pentium Pro的测试可能与您的嵌入式硬件最相关。如果您的应用程序更新10 TextBlocks每0.5秒您可以预计使用大约3%的CPU用于更新并在200MHz CPU上重绘。

如果我想让它更快?

使用数据绑定的TextBlocks列表非常方便,但WPF还提供了可在需要绝对最大性能时使用的底层机制。

WPF TextBlock实际上包含格式化的文档,而不仅仅是一个字符串,所以它是一个非常复杂的数据结构。编写自己的具有字符串参数的TrivialTextBlock控件非常简单,只需使用继承的TextElement属性(如FontSize,FontWeight等)来绘制它即可。这通常不会完成,因为TextBlock几乎适用于所有用途。

另一个需要注意的是,每当您更改TextBlock中的文本时,WPF都会重新计算布局。与旧技术不同,WPF TextBlock的内容可以很容易地更改UI的布局。因此,每次更改文本时都必须对文本进行重新测量和重新格式化。创建上述TrivialTextBlock控件也可以通过固定控件大小并从而避免布局通过来加速此控件。

第三个考虑因素是WPF的文本格式化程序具有高级版式功能,支持字距缩放,双向文本,连字,unicode功能,自定义字体权重等。为了在WPF中获得绝对最佳性能,您可以绕过文本格式化程序完全并将您的文本绘制为一系列图像。这需要大约20行XAML和大约40行C#代码。

所有这些优化都是可能的,但在你的情况下,我不会打扰他们:这样做只保存3%的CPU使用率可能是不值得的。

+0

哇,这是一个令人难以置信的有用和彻底的答复,它真的让我的一天。谢谢雷。 我使用运行Windows 7的Atom CPU设置了另一台PC。在我的工作站上以5-10%CPU运行的相同程序在此PC上的0%CPU上运行。我的工作站上显卡和驱动程序肯定有一些问题。无论是或者WPF渲染在Windows 7中比XP更快。 感谢您在TextBlock更新中调用布局系统的提示,我一定会牢记这一点。 祝您有美好的一天! – 2010-03-18 20:55:26

4

就性能而言,WPF中存在很多错误。很多人将它视为赢得表格应用程序,html网页或开发应用程序时的混合攻击,因此WPF有很多不好的评估。

我知道您正在尝试执行性能测试以查看WPF是否可以在您的平台上工作,并且提供一个如何让您的WPF应用程序控制执行以满足您期望的负载类型的很好示例。下面的链接。

http://msdn.microsoft.com/en-us/magazine/dd483292.aspx

彼佐尔德引导你通过优化一个项目的过程控制,以最佳渲染在UI上显示的数据的负载。

为了做一个公平的测试,我会编写一个样例应用程序,处理您将要处理的数据样本,然后测试该代码的性能。有大量的优化可用于使WPF应用程序尖叫并使用更少的CPU,但它们都依赖于应用程序以及它如何表示数据。

希望这会有所帮助。

+0

对我来说,WPF的主要卖点之一就是它允许你在更高的抽象层次上工作,希望能够提高生产力。但是,如果(可能)这样简单的事情导致CPU负载过高,并且需要深入研究才能使其表现良好,那么生产力优势开始消失。我将不得不做更多的研究似乎。 – 2010-03-18 15:53:18

+0

它可以提高工作效率,但是您必须首先了解WPF的用法和使用方法。一旦你经历了,你可以快速构建应用程序的速度。我已经用WPF构建了一些应用程序,目前正在使用WPF开发企业级应用程序,开发时间比其他平台的开发时间短得多,并且所获得的灵活性非常好。 – 2010-03-18 19:06:04

3

如果您确定您的部署硬件非常好,那么我只会使用WPF作为新产品。实际上,我认为专用显卡是最低要求。

我的团队选择WPF作为针对Atom处理器平台的项目,因为集成的GMA 500图形声明WPF呈现第2层。但是,出于某种原因,GMA 500的性能非常低,我们将硬件渲染转换为获得更好的表现。即便如此,Atom平台的合理性能仍然不足。我建议不要使用WPF,如果上网本或任何与英特尔凌动是您的客户群的一部分。

Here is a link到一个问题,我对WPF对GMA 500

正如罗布珀金斯建议性能开放的,你可能会获得更好的性能与Silverlight 4的更好。

祝你好运!

+0

感谢您的输入。我们能够获得更新的双核Atom。它通过实时矢量制图和几个经常更新的TextBlocks来驱动两个显示器,而且几乎没有问题。图表的WPF4缓存的作品帮助了很多。在禁用Aero的Windows 7上运行也非常有帮助。我们有大约1-3%的稳定状态CPU负载,UI非常敏感。与我的酷睿i7/nVidia GPU笔记本电脑相比,动画绝对是一种结构,但用户体验并没有太大变化。 – 2011-02-02 05:37:33