【问题标题】:Improve binding speed提高装订速度
【发布时间】:2011-11-16 22:45:43
【问题描述】:

阅读文档时,似乎 WPF 使用反射来绑定到 CLR 对象。在我的应用程序中,我将 DataGrid 绑定到仅包含 250 个项目(每个项目有 8 个属性)的 IList<T>DataGrid 正在使用虚拟化,因此它仅获取 30 项左右的属性。这些属性都是简单的字符串,仍然需要数百毫秒,如果您将其与通过复杂的数据库查询生成该列表所需的 40 毫秒进行比较,这太长了。

有没有什么技巧可以提高绑定时间?

【问题讨论】:

    标签: wpf performance reflection binding clr


    【解决方案1】:

    所以,这是一个猜测,但它以前发生在我身上,值得一试。不过,在猜测之前,您是否对代码进行了概要分析,以准确地查看哪些调用花费的时间最多?当您说使用绑定时时间会急剧增加时,我相信您,但是我将要给出的建议可以通过分析结果来证明或反驳。总之……

    不久前,我开发了一个应用程序,该应用程序生成了许多小的 UI 元素。每个元素都是UserControl 的一个实例,并使用数据绑定来显示其外观。我注意到,当生成许多(200 多个)这些元素时,会有明显的滞后。

    我们使用 Prism 及其 ViewModelBase 类,将委托传递给 RaisePropertyChanged 方法,即,

    private int _foo;
    public int Foo
    {
        get { return _foo; }
        set
        {
            if( _foo != value )
            {
                _foo = value;
                RaisePropertyChanged( this.Foo );  // trouble
            }
        }
    }
    

    这样做的问题是RaisePropertyChanged的实现必须使用反射来获取属性名作为字符串。当其中很多(我的意思是很多)被解雇时,性能就会受到重大影响。

    解决方案?使用字符串而不是函数对象。是的,这就是全部。这有点臭,因为如果您重构该属性,您必须记住更改两件事,但老实说,在许多情况下性能下降是不值得的。

    不管怎样,试一试。如果大量 CPU 时间花在 RaisePropertyChanged 中,这可能就是原因。

    【讨论】:

    • 感谢您的意见!但是,所有属性都是只读的并且永远不会更改,因此根本不使用“PropertyChanged”。您对使用什么软件进行分析有什么建议吗?我尝试了一些,但从中获得任何有意义的结果似乎很复杂?
    • @Joshua:好的,抱歉,我帮不上忙。我使用 redgate 的 ANTS profiler 取得了不错的效果。免费使用 2 周。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2020-07-12
    • 2016-08-14
    相关资源
    最近更新 更多