代码之家  ›  专栏  ›  技术社区  ›  Marco Bettiolo

为什么wpf中的相同代码比windows窗体中的慢?

  •  3
  • Marco Bettiolo  · 技术社区  · 14 年前

    我做了很多框架4.0和更早版本的基准测试,我不明白为什么在使用wpf时,相同的代码比windows窗体慢:

    这是代码,与ui元素无关:

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

    在windows窗体中执行代码需要5968ms-6024ms,在wpf中执行代码需要6953ms。

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

    5 回复  |  直到 13 年前
        1
  •  1
  •   Ray Burns    14 年前

    当我下载zip文件并查看您的代码时,问题变得显而易见: 它不是同一个代码。

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

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

    1. 它们采用不同的参数类型
    2. 它们包含不同的数字(9对7)和局部变量类型
    3. 它们进行不同数量的方法调用
    4. 它们有不同数量的循环
    5. 一个调用application.doEvents(),另一个不调用

    我的猜测是,在winforms版本的代码中,jit编译器将变量“i”放在堆栈偏移处,而在wpf版本中,它将其放在寄存器中,然后需要在每次迭代中保存该寄存器。

    无论如何,不要把差异归咎于wpf和winforms:把差异归咎于两个不同的测试,它们表面上看起来很相似,但优化的方式不同。

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

        2
  •  3
  •   Robert Harvey    14 年前

    在windows机器上,很多事情都可能在6秒内发生。我可以想象,wpf中的后台处理与winforms中的后台处理有点不同(并且会带来更多的开销)。

        3
  •  3
  •   Tim Cooper    13 年前

    第一个循环对我来说是同样的速度。

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

        4
  •  2
  •   deanvmc    14 年前

    首先,要排除任何环境因素,您必须在24到48小时内对每个溶液进行此测试。其次,它变慢的实际逻辑是有缺陷的。如果您从这个应用程序中分离任何gui gode,您将看到它们都以相同的框架为目标,因此它们不应该有任何不同。

    如果您正在测试哪个gui框架更快,那么您的测试是无效的,因为它没有发挥任何一个优点或缺点。以这种方式对winforms测试wpf就是忽略了两个框架之间的根本区别。

    由于两个框架都是共存的,因此没有测试每个框架的有偏见的方法。如果说wpf在呈现复杂的原语或昂贵的gui操作方面更快,则有缺陷,因为测试会偏向于wpf。

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

    我不担心速度,因为如果一个客户有能力正确运行一个wpf应用程序,那么得失将是如此微不足道,他们将不重要。

        5
  •  1
  •   BlackICE    14 年前

    屏幕上有某种形式的显示吗?我想你看到的可能是表单的开销差异。