Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++ 使用一个循环与两个循环_C++_Performance - Fatal编程技术网

C++ 使用一个循环与两个循环

C++ 使用一个循环与两个循环,c++,performance,C++,Performance,我在读这个博客:-。我决定用C++和XCODER检查它。所以,我写了一个下面给出的简单程序,当我执行它时,我对结果感到惊讶。实际上,第二个函数比第一个函数慢,这与本文中所述相反。谁能帮我弄清楚为什么会这样 #include <iostream> #include <vector> #include <chrono> using namespace std::chrono; void function1() { const int n

我在读这个博客:-。我决定用C++和XCODER检查它。所以,我写了一个下面给出的简单程序,当我执行它时,我对结果感到惊讶。实际上,第二个函数比第一个函数慢,这与本文中所述相反。谁能帮我弄清楚为什么会这样

#include <iostream> #include <vector> #include <chrono> using namespace std::chrono; void function1() { const int n=100000; int a1[n], b1[n], c1[n], d1[n]; for(int j=0;j<n;j++){ a1[j] = 0; b1[j] = 0; c1[j] = 0; d1[j] = 0; } auto start = high_resolution_clock::now(); for(int j=0;j<n;j++){ a1[j] += b1[j]; c1[j] += d1[j]; } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop - start); std::cout << duration.count() << " Microseconds." << std::endl; } void function2() { const int n=100000; int a1[n], b1[n], c1[n], d1[n]; for(int j=0; j<n; j++){ a1[j] = 0; b1[j] = 0; c1[j] = 0; d1[j] = 0; } auto start = high_resolution_clock::now(); for(int j=0; j<n; j++){ a1[j] += b1[j]; } for(int j=0;j<n;j++){ c1[j] += d1[j]; } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop - start); std::cout << duration.count() << " Microseconds." << std::endl; } int main(int argc, const char * argv[]) { function1(); function2(); return 0; } #包括 #包括 #包括 使用名称空间std::chrono; 无效函数1(){ 常数n=100000; 内部a1[n]、b1[n]、c1[n]、d1[n];
对于(int j=0;j第二个函数的迭代次数是第一个函数的两倍,这意味着条件分支的迭代次数是第一个函数的两倍(在现代CPU上仍然非常昂贵)此外,第二个函数必须分配一个额外的迭代器变量,并且必须将迭代器变量增加两倍

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


这篇文章还提到,对于不同的系统和不同大小的阵列,这种行为可能并不一致。他的文章专门围绕磁盘缓存的含义展开,这在代码中可能有效,也可能无效。

第二种方法在您的情况下速度更快的原因(我认为这在任何机器上都不起作用)在cpu有足够的缓存来存储阵列、操作系统需要的东西等的时候,第二个函数可能比第一个函数慢得多。
从性能的角度来看。如果有足够多的其他程序同时运行,我怀疑双循环代码是否能提供更好的性能,因为第二个函数的效率明显低于第一个函数,如果缓存了足够多的其他内容,则性能超前抛出缓存将被取消。

是否使用优化代码?Wh有时你看到了吗?计时的差异是什么?可能是随机波动吗?一种更容易显示的方法是在计时器内运行每个循环1000次,看看第一个循环是否始终比另一个循环慢。@Korosia 10次迭代的一致性约为300微秒。您好,我使用hea分配了数组p这一次,我运行了1000次实验,然后取了两个结果的平均值。但是,函数2的平均性能为5微秒,而函数1的平均性能为3.4微秒。我希望函数1的性能更好。我还能做些什么吗?我很困惑。你说函数1的平均性能为3.4毫秒croseconds和函数2花费了5微秒。如果是这种情况,那么函数1的性能更好:执行时间更短。你的意思是相反的吗?堆栈和堆具有不同的分配和释放性能,但它们在generalI中应该具有相同的使用性能。我知道它们通常会就使用率而言,我有类似的性能。但是,考虑到堆栈内存(据我所知)通常情况下,磁盘不是缓存的,问题的中心是磁盘缓存对性能的影响,我认为这是值得一提的。注意:如果我在这里错了,请纠正我。是的,这是有意义的,当你有足够的缓存时,使用两个for循环会更好。还有一件事-编译器在他的像循环裂变或循环融合等检查是否有足够的缓存,如果有,则不执行循环裂变,如果没有足够的缓存,则执行循环裂变等?