【问题标题】:Optimising Loops [closed]优化循环[关闭]
【发布时间】:2020-08-01 18:13:57
【问题描述】:

什么会更有效率?

伪代码:

    void function(x) {
    if (x == arg1) {
        execute while loop here
    }
    else if (x == arg2) {
        execute different version of while loop here
    }
    else..
}

void function(x) {
    while (valid) {
        if (x == arg1) {
            logic here..
        }
        else if (x == arg2) {
            logic here..
        }
        else..
    }
}

或者将while循环分割成函数会更好吗?

【问题讨论】:

  • 你可以试试https://godbolt.org/ 并有一个想法。我不认为你的问题有答案。这取决于逻辑、输入数据、输入元素的频率、编译器优化等。
  • 我相信对于大多数具有适当优化标志和不完整任务的现代编译器来说,这应该无关紧要。但我更喜欢第一个版本或单独的功能版本。
  • 错误的问题,而是询问哪种方式更直接地安排代码。把优化留给编译器,除非你能证明编译器需要一些帮助。
  • 测量它!其他一切都是货物崇拜编程。
  • 源代码是对可观察行为的描述,而不是要执行的指令列表。编译器提供指令列表,以及编译器可以对您的代码执行的任何操作,以使其在不破坏所描述行为的情况下更快,it will do

标签: c++ loops while-loop


【解决方案1】:

我们生活在一个美好的时代,您可以自己回答这个问题,永远不用问任何人。

但首先:接受您正在进行微优化。真正重要的是究竟出现在测试中,根据缓存位置如何访问值,以及如果测试成功会做什么。 这样的微优化没有任何区别是一个有效的结果。它只是告诉您您的注意力集中在错误的区域。

它还告诉您,CPU 制造商进行的价值数十亿美元的研发正在获得回报。现代 CPU 在尽一切可能从代码中获得性能方面非常出色。如果您没有做一些非常糟糕的事情,例如拥有std::list<type*>,并且没有为您测试的项目浪费内存,那么您已经处于一个良好的起点。

  1. 查看godbolt 上的优化 程序集输出(或您自己运行的编译器!)。确保您确实启用了优化(-O3 用于 gcc/clang,/O4 用于 msvc)。否则你就是在浪费时间。特别注意编译器对循环向量化的尝试。

  2. 运行基准测试。但是要了解什么是良好的基准测试。参见例如How can I benchmark the performance of C++ code?

  3. 让您的问题更具体。就目前而言,如果您不显示真实代码(但要适当地最小化!),它就无法得到合理的回答,应该关闭。

【讨论】:

    【解决方案2】:

    第一个版本测试x == argN 一次,而第二个版本在每个循环中都测试一次。对于给定的伪代码,第一个更好。

    【讨论】:

    • 请注意,一个好的编译器会发现这一点,如果 if 可以是 hoisted 而不会造成伤害,它将提升。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2016-10-09
    • 2021-12-12
    • 2011-09-15
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多