首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这是预期的缓慢的WPF TextBlock性能吗?

这是预期的缓慢的WPF TextBlock性能吗?
EN

Stack Overflow用户
提问于 2010-03-18 03:19:20
回答 3查看 10.6K关注 0票数 19

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

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

代码语言:javascript
运行
复制
<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>

下面是后面的代码:

代码语言:javascript
运行
复制
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();
        }
    }
}

根据Task Manager的说法,这消耗了大约5-10%的CPU,或者高达一个内核的20%!有没有更好的快速呈现文本的方法?

我的电脑: XP SP3,2.26 GHz酷睿2双核处理器,4 GB内存,英特尔4500高清集成显卡。这比我在实际产品中需要开发的硬件强了一个数量级。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-19 04:11:53

这种缓慢的TextBlock性能正常吗?

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

我使用您发布的代码运行了几个测试,将更新间隔保留为0.1s,并改变了硬件和TextBlocks的数量。这是我发现的:

代码语言:javascript
运行
复制
 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倍。如果你的代码像看起来那么简单,我怀疑你的图形处理器或DirectX驱动程序中有一些奇怪的东西。

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

我在200 the Pro上的测试可能是与您的嵌入式硬件最相关的。如果您的应用程序每隔0.5s更新一次10CPU,那么在200 the的上更新和重绘可能需要使用大约3%的。

如果我想让它更快怎么办?

使用数据绑定TextBlocks列表非常方便,但它还提供了较低级别的机制,当您需要绝对最高性能时可以使用这些机制。

WPF TextBlock实际上包含一个格式化的文档,而不仅仅是一个字符串,因此它是一个非常复杂的数据结构。编写自己的具有字符串参数的TrivialTextBlock控件并使用继承的TextElement属性(如FontSize、FontWeight等)简单地绘制它是非常简单的。通常不会这样做,因为TextBlock对于几乎所有目的都足够快。

另一个注意事项是,每次更改TextBlock中的文本时,WPF都会重新计算布局。与旧技术不同,WPF TextBlock的内容可以非常容易地更改UI的布局。因此,每次更改文本时,都必须重新测量和重新格式化文本。创建前面提到的TrivialTextBlock控件也可以通过固定控件大小来加快速度,从而避免布局过程。

第三个考虑因素是,WPF的文本格式化程序具有高级排版功能,支持诸如字距调整、双向文本、连字、unicode功能、自定义字体粗细等功能。这需要大约20行XAML和大约40行C#代码。

所有这些优化都是可能的,但在您的情况下,我不会为它们而烦恼:这样做可能不值得仅仅为了节省3%的CPU使用率。

票数 43
EN

Stack Overflow用户

发布于 2010-03-18 05:15:39

就性能而言,在WPF中可以做很多错误的事情。很多人使用win forms应用程序,html网页,或者开发应用程序时的混合攻击,因此对WPF有很多不好的评价。

我知道您正在尝试进行性能测试,看看WPF是否可以在您的平台上工作,在下面的链接中可以找到一个很好的示例,说明如何让您的WPF应用程序控件针对您期望的负载类型执行。

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

Petzold将指导您完成优化items控件的过程,以便针对UI上显示的数据负载进行最佳呈现。

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

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2011-02-02 03:14:59

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

我的团队为一个以Atom处理器平台为目标的项目选择了WPF,因为集成的GMA 500图形要求WPF render Tier 2。然而,由于某些原因,GMA 500的性能非常慢,我们关闭了硬件渲染以获得更好的性能。即使这样,Atom平台也无法提供合理的性能。我建议不要使用WPF,如果上网本或英特尔凌动的任何东西是你的客户群的一部分。

Here is a link回答了一个关于WPF在GMA500上的性能的问题。

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

祝好运!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2465181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档