WPF和Winforms之间是否存在性能差异?

mlw*_*428 20 wpf winforms

标题基本概括了所有内容.我做了一些谷歌搜索,但我能找到的唯一信息是至少一年,有些信息比Windows 7旧.所以我很好奇,使用WPF会有性能损失吗?

对于某些事情(例如数据绑定)来说,它比你在WinForms上一起攻击的速度更快吗?

这将是一个用.NET创建的项目,以防对任何人都很重要.

编辑

我正在看的这个项目有一个基本的UI风格,但是可能会显示很多信息(它查询文件/目录并在屏幕上显示它们).我还没有决定它是否会自动刷新屏幕,但我想它可能会.

可能会有相当多的控制,但任何人都不应该考虑"图形"密集.

从业务应用程序的角度来看,我正在关注性能.

我不打算使用第三方控件.

Mik*_*bel 18

对此没有任何有意义的"是"或"否"答案.这取决于许多因素,包括但不限于:

  1. 你正在构建什么样的UI.

    显然,您正在设计的视图的复杂性将影响两个平台上的性能.它们具有不同的布局和渲染管道.

  2. 如何有效地优化每个平台的性能.

    当然,使用两个平台实现性能较差的UI很容易.实现复杂的UI以使其执行得非常好,需要知道如何有效地利用每个平台的优势和劣势.

  3. 无论您是使用开箱即用的控件还是第三方控件,以及这些控件的质量.

    第1项和第2项也会转移到任何第三方组件.

如果您是一位经验丰富且称职的WinForms开发人员,那么您可能已经知道如何在WinForms中创建高性能视图.WPF的学习曲线很陡; 任何经验丰富的WPF开发者都可以告诉你.他们还会告诉您,您可以使用它来构建性能良好的丰富UI.这也是事实.WinForms也是如此.

两个平台都很成熟.两者都被广泛使用.除了错误修复之外,两者都不可能看到任何未来的改进.

所有这一切,如果你还没有在任何一个平台上投入大量资金,我会选择WPF路线.它是一个丰富的(虽然是重量级)框架,可以使其表现良好.使其运行良好所需的工作量在很大程度上取决于您正在创建的视图类型,但我使用WPF构建了许多高容量,高频率数据视图.我还用WPF构建了一个视觉丰富的策略游戏.但不要觉得有必要忍受它; 如果您的开发人员已经熟悉WinForms,那么它仍然是一个非常可行的选择.


更新:我认为未来几年WinForms支持不太可能从.NET中删除,但如果这是一个问题,那么我会选择WPF.您描述的视图类型可以在WPF中轻松创建.为了比较,我有几个视图能够显示50,000到500,000行,60列以上; 每秒数千行更新; 应用自定义,多级排序和分组; 自定义过滤; 自定义摘要; 所有都保持最新的伪实时("人"实时).获得这种性能水平并不容易,但可以做到.使用任一平台和仅使用内置控件套件,您描述的数据量和频率应该更容易实现.


Fed*_*gui 18

如果您正在进行复杂的UI,那么WPF就是您的选择.winforms不支持任何东西.

如果您正在使用简单的UI,WPF是可行的方法,因为:

  • 它允许一个更清晰的模式(MVVM),而不是可怕的太多代码 - 对于一切程序性winforms方法.
  • 它具有更强大的DataBinding功能.
  • 如果你需要定制任何东西,你可以.
  • 它具有内置的UI虚拟化.
  • 默认情况下,它与分辨率无关.

如果你担心长期:

WPF是要走的路.当前/未来的Windows UI框架是WinRT XAML.最终将WPF应用程序移植到WinRT XAML比使用winforms应用程序更容易.而且,由于MVVM实际上与技术无关,因此您最终可以在任何其他UI技术中重用ViewModel.

编辑:由于我一直收到许多downvotes并且围绕这个答案进行了很多讨论,我将特别关注OP的问题并尝试提供一个相当客观的答案:


性能:当您比较WPF反对的WinForms为非常简单的用户界面内存使用(一个WindowForm仅含有TextBox例如),WPF似乎消耗比的WinForms更多的内存.这是因为WPF框架比winforms大得多,因此它还有更多"要加载的东西"才能工作.比较冷启动时间(同样,在1控制情况下)也是如此.

相比之下,当您创建由多个控件/ Buttons/DataGrids/ComboBoxes/TextBoxes /等(在业务应用程序中非常常见的事物)组成的较重的UI时,差异开始减小,直到它甚至支持WPF.这是因为WPF的DependencyProperty系统,它将默认属性值存储在单个内存空间中,而不是基于每个实例.

WPF旨在从一开始就用于复杂/丰富的UI,并且针对有数千个控件而非1个控件的情况进行了优化.

从数据为中心的角度比较WPF和winforms之间的性能时要考虑的另一个非常重要的方面是,如上所述,UI虚拟化.只需看一下这个视频,很明显WPF在需要显示20k行的情况下表现得更好ListBox.我被一个winforms大师告知winforms似乎也支持这个,但是由于winforms没有正确支持,你需要求助于P/Invoke,并且据他所说,如果其他控件放在一边对我来说并不明显从ListBox也支持winforms(例如DataGridViewTreeView).ItemsControls默认情况下,所有WPF 都已经或可以使用一些简单的应用程序范围样式进行虚拟化.

硬件加速:你可能会认为"我不需要这个",但是如果你环顾四周,有很多情况下winforms在更新UI时会开始出现可怕的闪烁,不一定是在复杂的绘图情况下,而是在调整大小时包含许多控件的窗口.有一些方法可以解决这个问题,但是再一次,你必须开始浪费时间来解决一个你永远不应该开始的问题,而不是专注于你的业务逻辑.你永远不会遇到WPF这个问题,不仅因为它是硬件加速的,而且因为它是基于矢量的,而不是基于Bitmap的.

结论:尽管winforms在1控制案例中的表现可能更好,但WPF在现实世界数据中心UI的各个层面都是明显的赢家.


除此之外,正如@Blam所提到的,选择一项技术需要您不仅要分析性能方面,还需要分析可扩展性,可定制性,可维护性,易于开发,长期视角以及许多其他方面.

在所有这些方面,WPF再次成为明显的赢家.精心设计的WPF MVVM应用程序具有非常干净,简洁,漂亮的代码库.winforms,无论你是多么专家,都会一直强迫你进入解决方案背后的脏代码,只是因为它不支持真正复杂的场景,并且需要几乎所有人都能想到的自定义代码.

特别是可定制性,我会说,即使你not计划创建一个完全自定义,丰富的用户界面,选择WPF仍然是一个更明智的决定,因为有了winforms,如果你想要显示你的最终你可能会碰壁数据采用默认不支持的格式.然后你将不得不开始痛苦,并失去你的时间与可怕的技术,如"所有者绘制",而在WPF所有你需要的是一个简单的DataTemplate

当然,WPF是一个复杂的框架,但实际上并不是它的复杂性使得学习曲线陡峭,而是所需的心态变化才是大多数来自其他框架的开发人员所挣扎的.

而且,如上所述,您必须对抽象进行编码,而不是针对特定的一组类进行编码,这样您的代码最终可以根据需要移植到其他框架.WPF允许这样做,winforms没有.

如果你在winforms上编码,那么你将永远陷入winforms的无能力和黑客攻击的代码中.确实,如果你在winforms上使用MVP,这有点缓解,但仍然是演示者与UI框架的耦合比MVVM中的ViewModel更紧密,这完全与UI无关.

如果使用XAML和MVVM在WPF中编码,最终可以将WPF XAML视图替换为其他内容,并保持ViewModel不受影响,这意味着您实际上不必从头开始重写整个应用程序,因为ViewModel Application,不是意见.

  • 尽管我喜欢WPF,但我不会说WinForms是没用的......如果你用非常简单的UI制作简单的应用程序,它可以更快地开发.当我想制作一个内部使用的"快速和脏"工具时,我仍然使用它 (15认同)
  • "完全没用"听起来不像一个中立的,经过深思熟虑的观点.就个人而言,我不相信100%的要求. (13认同)
  • 同意Thomas和Uwe.两种平台都有首选的模式和实践.据称WPF的必要性与其高性能承诺一样超卖(它从未完全符合它们).但它是一个功能强大且功能强大的平台,如果你不是在WinForms中,我会说WPF更可取. (4认同)
  • 没用就没用了.作为WinForms开发人员,我意识到了我的局限性.如果学习曲线不那么陡峭且我们的应用程序没有在如此短的时间表上,我很可能会赞成WPF.但是,讨论WPF与WinForms类似于讨论C++与C#.两者都有自己的位置,都有其独特的优点和缺点.说一个比另一个更好意味着整个主观论点. (4认同)
  • @Thomas “如果您使用非常简单的 UI 制作简单的应用程序,它可以加快开发速度” 怎么样?WPF 有一个带有工具箱的可视化编辑器,因此您可以快速打开控件。时间发展差异可忽略不计 (2认同)
  • @Shoe,是的,WPF 有一个视觉设计器,但它太糟糕了,我从不使用它。它没有利用 WPF 布局系统,并且总是使用边距进行绝对定位,这是愚蠢的。当然,您可以更改它,但默认定位完全是错误的,并且它会鼓励不良做法。 (2认同)

小智 9

我尝试在winforms的面板上绘制大量的线条,并在画布上使用WPF绘制相同的dt,发现winforms在不到一秒的时间内创建了旋转,WPF花了很多秒,即使我在WPF中使用Pathgeometry而不是而不是shpes


小智 6

我已经用 MVVM 模式为 Windows 窗体和 WPF 编写了许多应用程序,当您比较在两者上实现的相同应用程序时,Windows 窗体在数据绑定应用程序中胜出。如果您有多个子数据网格绑定到单个父数据网格或结构,您会注意到更多的影响,永远不明白为什么。因此,对于业务应用程序,我总是只在必要时才使用 WPF 进行编码。我还发现 Windows 窗体上的排序和过滤也更容易。