Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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,还是在性能方面是一样的 例如,哪个更快 int a = 1, b = 2; for (int i = 0; i < 10; ++i) { a = a + 1; b = b + 1; } inta=1,b=2; 对于(int i=0;i

还是在性能方面是一样的

例如,哪个更快

int a = 1, b = 2;
for (int i = 0; i < 10; ++i) {
    a = a + 1;
    b = b + 1;
}
inta=1,b=2;
对于(int i=0;i<10;++i){
a=a+1;
b=b+1;
}

for(int i=0;i<10;++i){
a=a+1;
}
对于(int i=0;i<10;++i){
b=b+1;
}

注意:我更改了我的示例,因为很多人似乎对其中的语句而不是我问题的目的犹豫不决。

您的两个示例都没有任何作用,大多数编译器都会将它们优化为相同的东西—根本没有


更新:您的两个新示例显然是等效的。如果任何编译器为其中一个生成了比另一个更好的代码,那么它是一个低质量的编译器,您应该使用一个更好的编译器。

正如人们所指出的,无论我采用哪种方式,编译器都会进行优化,但这实际上取决于循环中的语句.

性能取决于循环的内容

让我们为循环分解
循环的
由以下部分组成:

  • 初始化
  • 比较
  • 递增
  • 内容(声明)
  • 分支
  • 让我们将比较定义为比较指令(设置处理器状态位)和分支(利用处理器状态位)

    处理器在执行数据指令时最开心。处理器处理数据,然后处理管道(缓存)中的下一条指令

    处理器不喜欢第2)节比较和第5)节分支(到循环的顶部)。分支意味着处理器停止处理数据并执行逻辑以确定是否需要替换指令缓存。这段时间可以用来处理数据指令

    优化
    for
    循环的目标是减少分支。其次是优化数据缓存/内存访问。一种常见的优化技术是循环展开,或者基本上在
    for
    循环中放置更多语句。作为度量,您可以将
    for
    循环的开销除以循环中语句的数量

    根据以上信息,您的第一个循环(使用两个赋值语句)将更加高效,因为每个循环有更多的数据指令;总体上减少了开销

    编辑1:并行环境
    但是,您的第二个示例可能更快。编译器可以将两个循环设置为并行运行(通过指令或实际的并行任务)。因为两个循环都是独立的,所以它们可以同时运行,也可以在CPU核心之间分开运行。处理器具有可以在多个内存位置上执行公共操作的指令。您的第一个示例使这变得有点困难,因为它需要编译器进行更多的分析。由于第二个示例中的循环更简单,因此编译器的分析也更简单

    此外,迭代次数也是一个因素。对于小数量,回路应执行相同的操作或具有可忽略的差异。对于大量迭代,可能存在一些时间差异


    总结:简介。基准。唯一正确的答案取决于测量。它们可能因同时运行的应用程序、内存量(RAM和硬盘驱动器)、CPU核心数量和其他项目而有所不同。在您的系统上配置文件和基准测试。在其他系统上重复。

    两个示例具有相同的可观察行为(也就是说,没有任何可观察行为)。速度上的任何差异都取决于所使用的编译器、构建标志、执行环境,基本上取决于您的具体用例。“我更改了我的示例,因为很多人似乎对其中的语句而不是我问题的目的犹豫不决。”这是因为问题的答案可能取决于循环中的语句。编辑:使用编辑时,两个循环是相同的。为了清晰起见,如果
    I
    对两个操作具有相同的含义,我更喜欢第一个示例。如果
    I
    对这两个操作有不同的含义,我将使用第二个示例。您应该选择使代码的意图更容易理解的方法。如果两者都定义了相同的行为,大多数编译器会在性能受到影响时正确合并或拆分循环。下面是一个很好的答案:如果您想知道优化编译器如何处理此代码,请查看。无论是一个循环还是两个循环,它们都会完全蒸发,并简化为一条指令。写清楚的代码表达你的意图,让编译器担心小的优化。作为注释和投票来结束问题不是更好吗?哈哈,不。你为什么要结束我的问题?!只要说出你认为有什么问题,我会纠正的。我已经改正了。有时候,这些论坛的版主只是想对那些试图找到答案的人行使他们神圣的权力。我想知道我是否可以编写一个Python脚本,每5分钟发布一次相同的问题;)@Seb0029问题通常不会由主持人关闭,而是由社区关闭。“你为什么要结束我的问题?!”有很多问题要结束。在一般意义上,他们是关闭的,因为他们没有遵循本网站的指导方针。我个人认为这个问题不应该结束。到目前为止,由于“需要更多细节”,它只收到了一张关闭的投票票,但这么晚了,有两个答案和这么多的活动,它可能不会关闭。
    for (int i = 0; i < 10; ++i) {
        a = a + 1;
    }
    for (int i = 0; i < 10; ++i) {
        b = b + 1;
    }