Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么WPF中的相同代码比Windows窗体中的代码慢?_C#_Wpf_Benchmarking_Winforms - Fatal编程技术网

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

C# 为什么WPF中的相同代码比Windows窗体中的代码慢?,c#,wpf,benchmarking,winforms,C#,Wpf,Benchmarking,Winforms,我对framework 4.0及更旧版本进行了大量的基准测试,我不明白为什么与Windows窗体相比,使用WPF时相同的代码速度较慢: 这是代码,与UI元素无关: Random rnd = new Random(845038); Int64 number = 0; for (int i = 0; i < 500000000; i++) { number += rnd.Next(); }

我对framework 4.0及更旧版本进行了大量的基准测试,我不明白为什么与Windows窗体相比,使用WPF时相同的代码速度较慢:

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

        Random rnd = new Random(845038);
        Int64 number = 0;
        for (int i = 0; i < 500000000; i++)
        {
            number += rnd.Next();
        }
Random rnd=new Random(845038);
Int64数字=0;
对于(int i=0;i<500000000;i++)
{
number+=rnd.Next();
}
代码在Windows窗体中执行需要5968ms-6024ms,在WPF中执行需要6953ms


以下是关于可下载解决方案的帖子:

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

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

对于我来说,第一个循环以相同的速度运行


您是否在未连接调试程序的情况下测量

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

如果您正在测试哪个GUI框架更快,那么您的测试是无效的,因为它既没有发挥它们的优势,也没有发挥它们的劣势。以这种方式针对Winforms测试WPF会忽略这两个框架之间的根本区别

测试每一个框架并没有偏颇的方法,因为两者共存。说WPF在呈现复杂的原语或昂贵的GUI操作方面更快是有缺陷的,因为测试将偏向于WPF

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


我不会担心速度,因为如果客户能够正确运行WPF应用程序,那么获得或错过的东西将非常微小,它们将无关紧要。

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

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

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

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

    在任何情况下,都不要将差异归咎于WPF和WinForms:将差异归咎于有两个表面上相似但优化方式不同的不同测试


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

    测试的WPF UI是否有一些在后台运行的功能,如动画?无论如何,我相信WPF总是有事情要做,即使它应该是空闲的:)事实上,单次运行并不是获得良好基准的可靠方法。您应该测量几次并计算平均时间。@0XA3我在不同的时刻运行了很多次,得到了相似的结果。@Alex Farber:ui在两个测试中都没有做任何事情。有趣的是,控制台应用程序给出了与我机器上的WPF应用程序相似的计时(大约6.5到6.8秒)然而WinForms 4.0应用程序的速度更快(大约6.0到6.2秒)。同样,这些测试需要运行24到48小时才能获得真实的读数。@Robert Harvey:我在不同的时间运行了不同的程序,得到了类似的结果。为什么需要24小时?十几次测试应该会给你一个相当不错的大概数字。在我看来,任何测试都应该至少运行24小时才能给出正确的数字。在可以通过测试关闭的机器上,可以在后台执行任意数量的任务。在很长的一段时间内给他们一个固定的时间,结果就会正常化。哦,顺便说一句,我的回答不是针对你的答案,而是来自0xA31的评论。在那次测试中,我故意没有测试这个家伙,这个strage结果是一个非常有趣的结果。结果应该是一样的,但不同。是的。两个测试中都显示了一个包含三个控件的表单。在循环过程中,表单处于空闲状态。我运行的是没有pdb信息的发布代码,并在资源管理器中双击了exe。