是否期望这种慢速WPF TextBlock性能?

时间:2010-03-17 19:19:20

标签: c# wpf performance textblock

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

以下是不使用绑定的版本的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集成显卡。这比我在真实产品中需要开发的硬件强一个数量级。

3 个答案:

答案 0 :(得分:40)

这种缓慢的TextBlock性能是否正常?

没有。如此慢的TextBlock性能绝对不正常。我的经验是TextBlocks比这快得多。

我使用您发布的代码运行了多次测试,更新间隔为0.1秒,并改变了TextBlocks的硬件和数量。这是我发现的:

 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的测试可能与您的嵌入式硬件最相关。如果您的应用程序每0.5秒更新 10个TextBlock ,您可以使用大约 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使用率,这可能是不值得的。

答案 1 :(得分:4)

就性能而言,WPF中有很多可以做错的事情。很多人接近它就像win表单应用程序,html网页,或者开发应用程序时的一些混合攻击,因此对WPF有很多不好的评价。

我知道您正在尝试进行性能测试以查看WPF是否可以适用于您的平台,并且可以找到一个很好的示例,说明如何让WPF应用程序控制执行您期望的负载类型。以下链接。

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

Petzold引导您完成优化项目控件的过程,以便最佳地呈现UI上显示的数据负载。

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

希望这有帮助。

答案 2 :(得分:3)

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

我的团队为一个针对Atom处理器平台的项目选择了WPF,因为集成的GMA 500图形声称WPF渲染第2层。但是,出于某种原因,GMA 500的性能非常慢,我们关闭了硬件渲染更好的性能。即便如此,Atom平台的性能也不足以提供合理的性能。如果上网本或任何使用英特尔凌动的产品都是您客户群的一部分,我建议不要使用WPF。

Here is a link我就GMA 500上的WPF表现开了一个问题。

正如Rob Perkins建议的那样,为了获得更好的性能,你可能会更好地使用Silverlight 4。

祝你好运!