为什么WPF中的相同代码比Windows窗体中的相同?

时间:2010-04-13 13:55:41

标签: c# wpf benchmarking winforms

我做了大量的框架4.0及更早版本的基准测试,我无法理解为什么使用WPF时相同的代码比Windows窗体慢:

这是代码,它与UI元素无关:

        Random rnd = new Random(845038);
        Int64 number = 0;
        for (int i = 0; i < 500000000; i++)
        {
            number += rnd.Next();
        }

代码需要5968ms - 在Windows Forms中执行6024ms,在WPF中执行6953ms。

以下是包含可下载解决方案的帖子:http://blog.bettiolo.it/2010/04/benchmark-of-net-framework-40.html

5 个答案:

答案 0 :(得分:3)

Windows计算机上可能会在六秒内发生很多事情。我认为在WPF中发生的后台处理与Winforms中发生的后台处理略有不同(并且带来更多的开销)。

答案 1 :(得分:3)

第一个循环以相同的速度运行。

你是否测量没有附加的调试器?

答案 2 :(得分:2)

首先,要排除在24到48小时内为每种解决方案运行此测试所需的任何环境因素。其次,它变慢的实际逻辑是有缺陷的。如果你从这个应用程序中分离出任何gui gode,你会发现它们都是针对相同的框架而不应该有任何不同。

如果您正在测试哪个GUI框架更快,那么您的测试无效,因为它不会发挥任何优势或劣势。以这种方式对Winforms测试WPF是错过两个框架之间的根本区别。

由于两者都存在,因此没有偏向于测试每个框架的方法。要说WPF在渲染复杂原语或昂贵的GUI操作方面更快,因为测试会偏向于WPF。

基础模型可能如此不同的事实意味着任何这种性质的测试都是主观的。我不相信这种性质的测试只是因为他们要么试图证明作者的观点,要么反驳别人的方法。

我不会担心速度只是因为如果客户能够正确运行WPF应用程序,那么收益或失败将是如此微不足道,以至于无关紧要。

答案 3 :(得分:1)

您是否在屏幕上显示某种形式?我认为表格的开销差异可能就是你所看到的。

答案 4 :(得分:1)

当我下载zip文件并查看您的代码时,问题变得明显:代码不一样。

由于两个测试具有不同的代码,因此它们由C#编译器进行不同的编译,并由JIT编译器进行不同的优化。不同的寄存器分配给局部变量。使用不同的呼叫技术。使用不同的堆栈偏移。

以下是我在两种基准方法之间注意到的一些差异:

  1. 他们采用不同的参数类型
  2. 它们包含不同的数字(9对7)和局部变量的类型
  3. 他们进行不同数量的方法调用
  4. 他们有不同数量的循环
  5. 一个调用Application.DoEvents()而另一个调用
  6. 我的猜测是,在你的WinForms版本的代码中,JIT编译器将变量'i'放在堆栈偏移处,而在WPF版本中,它将它放在一个寄存器中,然后需要在每次迭代时保存。

    在任何情况下,都不要责怪WPF与WinForms之间的区别:归咎于两个不同的测试看起来表面上相似但得到不同的优化。

    将测试代码分解为单独类中的静态方法。 如果您在两个基准测试中使用相同的代码,我几乎可以保证您获得相同的结果。