【问题标题】:Performance hit on just overriding MeasureOverride?仅覆盖 MeasureOverride 会影响性能吗?
【发布时间】:2013-02-24 21:41:58
【问题描述】:

我有一个来自 WrapPanel 的派生类,它覆盖了 MeasureOverride 方法。我正在构建我的应用程序的骨架/原型,首先制作视图模型和视图以了解屏幕流程等,同时让其他人提供有关设计的反馈。所以它是一个非常轻量级的应用程序。

我注意到在打开下一个屏幕之前单击特定按钮需要很长时间,因此我对应用程序进行了概要分析(采样)。在 Startup 方法旁边,MeasureOverride 是占用时间最多的单个方法。这是我的代码:

public class GroupWrapPanel : WrapPanel
{
    public const double ItemSize = 120.0;

    protected override Size MeasureOverride(Size availableSize)
    {
        var numberOfRows = (availableSize.Height / ItemSize);
        var numberOfCols = (Children.Count / numberOfRows) + 1;

        var newSize = new Size(numberOfCols * ItemSize, availableSize.Height);

        return base.MeasureOverride(newSize);
    }
}

所以我注释掉了整个覆盖,现在它执行得很快 - MeasureOverride 不在占用大部分时间的方法列表中。我只是添加了一个覆盖,除了调用基类之外什么也没做。现在 MeasureOverride 又出现了,需要相当长的时间。

我做错了吗?

【问题讨论】:

  • 究竟是什么意思“我注释掉了整个覆盖”。它是一个空主体的 MeasureOverride,还是根本没有 MeasureOverride?​​span>
  • 我删除了我的答案,因为它更像是评论而不是答案。无论如何,有趣的问题,请提供更多信息。 “按钮在调出下一个屏幕之前花了很长时间。”下一个屏幕到底是什么? WrapPanel 是您的下一个屏幕,对吗?绘制/加载它需要太长时间?您认为这是性能缓慢的自定义度量逻辑错误吗?您是否也覆盖了排列方法?您能告诉我们您看到 GroupWrapPanel 的秒数吗?
  • @Clemens: "我注释掉了整个覆盖" => 根本没有方法。
  • @hedgehog:该应用由具有硬编码项目的 ViewModel 和显示(测试)数据的 View 组成。该应用程序不包含真正的逻辑,只是硬编码的虚拟数据。我使用 Caliburn.Micro 进行 ViewModel-View 匹配和 Conductor-Screen 导航。该按钮导航到新屏幕。该按钮保持黑色一段时间(大约一秒钟,不到两秒钟),然后显示新屏幕。我使用 StopWatch 来测量 Caliburn 以毫秒为单位 (
  • 于是我启动了分析器。我没有覆盖 Arrange 方法,只是 Measure(我只需要限制 WrapPanel)。我确实完全删除了我的逻辑——只留下一个呼叫基地。这仍然显示在性能结果中。

标签: wpf performance wpf-controls custom-controls


【解决方案1】:

如果您建议这样做:

protected override Size MeasureOverride(Size availableSize)
{
    return base.MeasureOverride(newSize);
}

导致显着放缓,这似乎不太可能。如果您在使用和不使用这种微不足道的覆盖的情况下真正进行分析并注意到不同的结果,我认为您的分析器上很可能有“只是我的代码”或类似设置,或者您已经过滤,以至于您没有看到当您看到GroupWrapPanel.MeasureOverride 时,WrapPanel.MeasureOverride 的成本。

面板的度量是否真的占用大量时间是另一回事,但可信 - 我建议挖掘调用树并找出调用的贡献,您可能会发现某些子项的测量成本很高。

【讨论】:

  • 这个帖子没用。你是在告诉他他不知道如何衡量表现。
  • 这篇文章很有帮助,因为“您可能会发现某些子项的测量成本很高”肯定是性能问题的确切原因。
  • 如果有孩子使用昂贵的度量,即使您注释掉度量覆盖,应用程序仍然会很慢。这家伙说没有自定义 measureoverride 速度更快,因此你的评论也没用。
  • 他完成了整个事情。完整的方法。 Measureoverride 总是根据什么类型调用
  • 阅读问题。他说的是整个方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2012-02-04
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2018-07-26
相关资源
最近更新 更多