【问题标题】:micro optimisation in for loop c++ [closed]for循环c ++中的微优化[关闭]
【发布时间】:2014-04-22 11:38:16
【问题描述】:

让我们假设C++ for 循环的形式为:

for(int i; i<10;i++)

所以整数需要在开始时分配,然后在每一步增加以及比较。那么做这样的事情不是更快吗:

f or(int i; i++<10;)

因为变量不需要再次加载到存储中?尤其是当volatile?

这个小示例代码在所有情况下都给出了相同的结果。 for 循环是否得到了优化,还是我遗漏了什么?

#include<iostream>
#include<ctime>

int main() {
    time_t start,ende;
    volatile int dummy = 1;
    const int rep = 1000000000;

    // Method 1
    start = time(0);
    for (int i = 0; i < rep; i++)
            dummy = 1;

    ende = time(0);                         
    std::cout << "Method 1: " << difftime(ende,start)*1000 << " ms" << std::endl;

    // Method 2
    start = time(0);
    for (int i = 0; i++ < rep; )
            dummy = 1;                                                              
    ende = time(0);
    std::cout << "Method 2: " << difftime(ende,start)*1000 << " ms" << std::endl;

    // Method 3
    start = time(0);
    for (volatile int i = 0; i < rep; i++)
            dummy = 1;

    ende = time(0);                         
    std::cout << "Method 3: " << difftime(ende,start)*1000 << " ms" << std::endl;
}

操作系统:Linux 编译器:g++ 优化:标准(无标志)

【问题讨论】:

  • 没有优化的分析是没有意义的,打开优化并从中得出结论。
  • 你为什么用volatile
  • @LuchianGrigore。我也用 O3 进行了跑步,没有任何改变。我不想太快下结论,所以才在这里问
  • @KarolyHorvath。这个想法是为了确保它确实会通过 for 循环运行,而不是简单地检测到没有任何变化,因此只是简单地缩短它。
  • 编译器很可能会优化掉那些循环。

标签: c++ micro-optimization


【解决方案1】:

编译器很多比你想象的要聪明。它们不会产生您认为的那种虚假负载。

【讨论】:

    【解决方案2】:

    优化取决于编译器及其选项。

    我建议你反汇编你的代码,看看优化的结果是什么。 一个简单的好拆卸例如HT editor 或 IDA 版本 5(现在免费)。对于一小段代码,这将很容易。

    【讨论】:

    • 感谢您的回答。不幸的是,我不知道任何汇编程序,因此我有点迷路了。
    • 对于一个小代码sn-p,它真的不像看起来那么难。但是,如果您对编译器优化真的很感兴趣并且对您有意义,那么了解汇编程序非常有用,并且可以帮助估计您的代码性能。您的变量排列对代码性能没有任何影响,因为编译器会对其进行分析并生成优化结果,其中 repi 可能根本不会作为单独的变量呈现。
    • 是的,我应该在某个时候调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2018-12-23
    • 1970-01-01
    • 2021-02-26
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多