【问题标题】:Test result difference on difference CPU不同CPU上的测试结果差异
【发布时间】:2014-03-20 13:19:54
【问题描述】:

我做了几个测试来测试属性和字段的访问时间。

我有这种测量方法:

  static void Measurer(Action act)
    {
        Stopwatch stop = Stopwatch.StartNew();
        for (int i = 0; i < 10000000; i++)
        {
            act.Invoke();    
        }

        stop.Stop();
        Console.WriteLine(stop.Elapsed);
    }

我有一些带有一些属性和字段的简单类,所以我有两个测试:

  Measurer(() =>
        {
            built1.LevelID = built.LevelID;
            built1.Enabled = built.Enabled;
            built1.Profile = built.Profile;
            built1.Modes = built.Modes;
        });

 Measurer(() =>
        {
            built1.levelID = built.levelID;
            built1.enabled = built.enabled;
            built1.profile = built.profile;
            built1.modes = built.modes;
        });

我也在测试不同的反射方法,但这里这些测试只是为了显示差异。项目适用于 4.5 框架。 因此,当我在 Windows 7 上使用 i5 CPU 的笔记本电脑上运行时,我在 Release x64 中构建项目,结果如下:

我可以访问我决定测试的服务器机器,它是 Xeon E560 2.4 Ghz,在 Windows Server 2008 R2 上带有 2 个处理器,我得到了以下结果:

那么为什么我在更好的机器上有这么大的差异呢?是什么导致了这种差异?有什么想法吗?我可以想到不同的东西,但这只是建议,也许有人知道为什么?

【问题讨论】:

  • 这两个系统并不完全是苹果对苹果。你说一个是服务器——它还在做什么?服务器是 32 位还是 64 位?笔记本电脑的 CPU 运行速度是否更快?它们是不同的 CPU(内核数量可能无关紧要)。
  • 服务器是 64 位以及 Windows 7,我编译为仅以 x64 为目标。服务器为 2.4 GHz,笔记本电脑为 2.5 Ghz。我没想到这会影响对属性或字段的访问时间。几乎慢了两倍!
  • Xenon 是比 i5 更早一代的 CPU。这很可能会产生影响。其他潜在的区别是高速缓存的数量和总线速度。正如 RQDQ 所说,那里有很多变量。
  • 我明白了,但没想到这速度慢了将近两倍,而且这是服务器,应该比笔记本电脑好,加油。我不是在和超旧的服务器比较。
  • @anderhil - 这还取决于您拥有的 i5 版本。 i5-4340M 最高可达 3.6 Ghz(比服务器快 1.5 倍)。

标签: c# windows performance reflection


【解决方案1】:

这里有许多变量,难以准确确定时间差异的来源。您的两个环境差别很大:

  • 不同的硬件(处理器、内存、主板等)
  • 不同版本的操作系统
  • 运行不同的软件/服务

此外,如果您通过远程桌面运行服务器版本,也会影响您的时间。

要从该测试中获得更多有用的数据,您必须控制更多变量(相同的操作系统、相同的软件配置等)。

编辑 - 远程桌面

关于为什么通过远程桌面执行此操作会影响时间的一些想法:

  • Console.Write 操作可能会阻塞。见this question。您的测试的编写方式理论上应该不会有太大的不同,但我对整个实现堆栈了解得不够多,无法知道这种差异对您的情况是否有意义。
  • Windows 有意在后台为远程桌面会话执行不同的操作。想到的项目与 Windows 窗体渲染有关,但可能还有其他差异。

【讨论】:

  • 我考虑了所有这些,但为什么它更慢,这就是问题所在。服务器更强大,时间总是一样的,增量很小,但运行几次后数字变化不大。你能详细解释一下为什么远程桌面会影响时间吗?
  • @anderhil 我添加了一些关于远程桌面差异的更多想法。此外,这些因素都不会影响您的服务器在测试时所承受的负载。这台服务器还在做什么?是网络服务器/文件服务器/等等吗?
  • 这台服务器是我们计划迁移到的服务器,所以它现在没有任何负载。但是我的 Console.WriteLine 在测量块之外,我在写入控制台之前停止了秒表。
  • 您是否可以物理访问服务器以在其中运行它?我很好奇你在那里运行是否会有任何显着差异。
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 2018-04-26
  • 2015-07-24
  • 2017-04-20
  • 2020-04-26
  • 2016-07-16
  • 2021-08-31
  • 2013-09-08
相关资源
最近更新 更多