【问题标题】:使用一个循环与两个循环
【发布时间】:2020-10-17 18:41:02
【问题描述】:

我正在阅读这个博客:- https://developerinsider.co/why-is-one-loop-so-much-slower-than-two-loops/。我决定使用 C++ 和 Xcode 进行检查。所以,我写了一个下面给出的简单程序,当我执行它时,我对结果感到惊讶。实际上,与文章中所述相反,与第一个功能相比,第二个功能要慢。谁能帮我弄清楚为什么会这样?

#include 
#include 
#include 
    
使用命名空间 std::chrono;
    
无效函数1(){
    常量 int n=100000;
            
    int a1[n],b1[n],c1[n],d1[n];
            
    for(int j=0;j(停止 - 开始);
        
    std::cout (停止 - 开始);
        
    std::cout 
    

【问题讨论】:

  • 您使用的是优化代码吗?你什么时候看的?
  • 时间上有什么不同?会不会是随机波动?一种更容易显示的方法是在计时器内运行每个循环 1000 次,以查看第一个循环是否始终比另一个慢。
  • @Korsia 10 次迭代的一致性约为 300 微秒。

标签: c++ performance


【解决方案1】:

第二个函数的迭代次数是第一个函数的两倍,这意味着条件分支增加了一倍(在现代 CPU 上仍然相当昂贵),这反过来又导致它变慢。此外,第二个函数必须分配一个额外的迭代器变量,并且它必须将一个迭代器变量增加两倍。

您的代码与本文中演示的代码之间还有一个主要区别:您的代码在堆栈上分配其数组,而本文的代码在堆上分配其数组。这对数组的性能表现有严重的影响。

文章还提到,对于不同的系统和不同大小的数组,行为可能并不统一。他的文章专门围绕磁盘缓存的含义展开,这些含义可能会或可能不会在您的代码中生效。

【讨论】:

  • 您好,我这次使用堆分配了数组,实验了1000次,然后取了两个结果的平均值。但是,函数 2 的平均执行时间为 5 微秒,而函数 1 的平均执行时间为 3.4 微秒。我期待功能 1 表现更好。我还能做些什么吗?
  • 我很困惑。你说函数 1 用了 3.4 微秒,而函数 2 用了 5 微秒。如果是这种情况,那么函数 1 的性能会更好:执行所需的时间更少。你的意思是相反的吗?
  • 栈和堆的分配和释放性能不同,但总体上应该具有相同的使用性能
  • 我知道它们在使用方面通常具有相似的性能。但是,考虑到堆栈内存(据我所知)通常不是磁盘缓存的,并且问题集中在磁盘缓存对性能的影响上,我认为值得一提。注意:如果我在这里错了,请纠正我。
【解决方案2】:

在你的情况下第二个更快的原因(我认为这在任何机器上都不起作用)是更好的 cpu 缓存,你的 cpu 有足够的缓存来存储数组,你的操作系统需要的东西依此类推,第二个功能可能会比第一个慢得多。 从性能的角度来看。我怀疑如果有足够多的其他程序也在运行,这两个循环代码会提供更好的性能,因为第二个函数的效率明显低于第一个函数,如果缓存了足够多的其他内容,性能领先抛出缓存将被消除。

【讨论】:

  • 是的,这是有道理的,当你有足够的缓存时使用两个 for 循环会更好。还有一件事 - 编译器是否自行执行任何这些优化,例如循环分裂或循环融合等检查是否有足够的缓存,如果有,则不执行循环分裂,如果没有足够的缓存,则执行循环分裂等等?
猜你喜欢
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2021-04-09
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多