【问题标题】:C++ Performance with/without "cout"带/不带“cout”的 C++ 性能
【发布时间】:2018-02-15 05:00:12
【问题描述】:

大家好,姑娘们。

我的问题很简单,但我没有答案。下面你可以看到我的 C++ 代码 - 它有点大但很简单 - 当我使用 //std::cout<<yy<<endl; (commented) 运行代码时它运行不到 1 秒,当我取消注释该行时它运行大约 2 分钟(我说的是 Release因为在调试中它运行更多时间)。请注意该行只产生很少的输出行(所以问题不在于程序必须调用“cout”太多次)谢谢大家。这是我的代码:

#include <cstdlib>
#include <iostream>

using namespace std;

struct cell {
    int x;
    int y;
};

int main(int argc, char** argv) {
    cell vector[8];
    unsigned long int yy=0;

    for (int aaa = 0; aaa < 8; aaa++) {
        vector[0].x = aaa;
        for (int aab = 0; aab < 8; aab++) {
            vector[0].y = aab;
            for (int aac = 0; aac < 8; aac++) {
                vector[1].x = aac;
                for (int aad = 0; aad < 8; aad++) {
                    vector[1].y = aad;
                    for (int aae = 0; aae < 8; aae++) {
                        vector[2].x = aae;
                        for (int aaf = 0; aaf < 8; aaf++) {
                            vector[2].y = aaf;
                            for (int aag = 0; aag < 8; aag++) {
                                vector[3].x = aag;
                                for (int aah = 0; aah < 8; aah++) {
                                    vector[3].y = aah;
                                    for (int aai = 0; aai < 8; aai++) {
                                        vector[4].x = aai;
                                        for (int aaj = 0; aaj < 8; aaj++) {
                                            vector[4].y = aaj;
                                            for (int aak = 0; aak < 8; aak++) {
                                                vector[5].x = aak;
                                                for (int aal = 0; aal < 8; aal++) {
                                                    vector[5].y = aal;
                                                                    yy++;
                                                                    if(yy%10000000000==0){
                                                                    vector[5].y = aal-1;
                                                                    //std::cout<<yy<<endl;
                                                                    }

                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    std::cout<<yy<<endl;
    std::cout<<vector[5].y<<endl;
    return 0;
}

【问题讨论】:

  • 天哪,为什么?........
  • 天哪,你怎么有耐心写这些嵌套循环???!
  • 发生这种情况是因为您的循环除了cout 之外什么都不做,并且可以在没有它的情况下被编译器完全删除。 godbolt.org/g/b8JCSr
  • 另外,我强烈建议不要生成这种代码,你很可能会攻击 XY 问题。
  • @SergiuVelescu 68719476736 次额外的循环迭代是与众不同的原因。

标签: c++


【解决方案1】:

其中大部分是一个简单的优化问题:只要您不从循环中产生任何输出,编译器就会确定循环基本上是死代码,并且根本不执行它们。它必须做一些预计算来确定vector[5].y 在循环之后的值,但它可以完全在编译时完成,所以在运行时,它基本上只是打印出一个固定的数字。

当您在循环内生成可见输出时,编译器不能仅仅消除执行它们,因此代码运行速度会大大降低。

【讨论】:

  • @LưuVĩnhPhúc:仔细看,这是一条红鲱鱼。
  • 好的 - 我想过这个 - “vector[5].y = aal-1;”怎么样在循环中 - 这不会强制编译器运行这些循环并计算值吗? (最后我也 COUT 这个值)
  • 看起来循环正在运行,因为当我评论一个循环时需要 160 毫秒才能完成,如果我取消评论大约需要 1 秒。
  • 看起来循环的一部分仍然存在 godbolt.org/g/WZDvrC 。或许真正的故事是,在消除了所有杂乱无章的情况后,实际循环的计算成本并不会太高。
  • 一些编译器可能比其他编译器更积极地执行此操作。 Clang 删除了所有循环,代码在我的 PC 上以 0.004 秒的速度运行,gcc 将其中的一些留在里面并在 0.8 秒左右运行。无论哪种方式,从这里得到的带回家的信息应该是“只分析有意义的代码,只是把东西放在一个巨大的循环中并不是一个合适的微基准。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2021-10-12
相关资源
最近更新 更多