代码之家  ›  专栏  ›  技术社区  ›  WhatIsHeDoing

重新排列条件求值是否会加快循环?

  •  11
  • WhatIsHeDoing  · 技术社区  · 17 年前

    for 循环自:

    for(int i = 0; i < constant; ++i) {
        // code...
    }
    

    致:

    for(int i = 0; constant > i; ++i) {
        // code...
    }
    

    while 循环:

    while i < constant:
        # code...
        i += 1
    

    vs:

    while constant > i:
        # code...
        i += 1
    

    13 回复  |  直到 17 年前
        1
  •  45
  •   chaos    17 年前

    它更多地是在C++民俗中,手工优化在特定编译器的特定版本上工作一次,然后被当作一种区分所有者和普通群体的知识。这是垃圾。貌相是真理。

        2
  •  17
  •   Eric Petroelje    17 年前

    可能不会,但如果它这样做了,编译器可能会自动为您进行优化。因此,请以任何方式使代码最具可读性。

        3
  •  10
  •   chaos    17 年前

    剖析器

    只有 你们可以向任何权威宣称一种方法比另一种方法快或慢。

        4
  •  8
  •   Kylotan    17 年前

    您给出的示例在C++中绝对不存在性能差异,并且我怀疑它们也不会在Python中有所不同。

    for (int i = 0; i < variable; ++i)
    
    // ...vs...
    
    for (int i = variable; i ; --i)
    

    在某些体系结构中,后者的速度更快,因为递减变量的动作将设置零标志,然后可以在跳转(如果不是零)指令中检查零标志,从而一次性提供循环迭代和条件。前一个示例需要执行显式比较或减法来设置标志,然后基于该标志跳转。

    然而

        5
  •  5
  •   JosephStyons    17 年前

    short-circuit evaluation

    while(bContinue && QueryStatusFromDatabase==1){
    }  //while
    

    while(QueryStatusFromDatabase==1 && bContinue){
    }  //while
    

    这是因为,当一个简单的布尔值为FALSE时,第一个可以立即停止——查询只需在布尔值为TRUE时运行,而第二个将运行 总是 运行查询。

    最糟糕的是当你有一个函数作为一个条件,而这个函数有一些副作用,这些副作用是代码中其他地方暗中期望的。因此,当你进行小优化时,副作用只会发生 一些 当然,你的代码会以奇怪的方式中断。但这有点相切。对你的问题的简短回答是“有时,但通常并不重要。”

        6
  •  4
  •   Aardvark    17 年前

    只有

    您可以比较每个选项创建的程序集,对于这样的微优化来说,这不应该是不可能的。对你的硬件平台的命令进行一点研究,可以给你一个不错的主意,如果这个改变有什么不同,以及它可能如何表现不同。我假设您将计算移动的数量并比较示例中的命令。

        7
  •  3
  •   chaos    17 年前

    这是一个最好的做法,不要走你的方式进行优化调整,这将给你带来微不足道的好处(假设它) 是

        8
  •  2
  •   Zifre    17 年前

    任何sane编译器都将以相同的方式实现这两种功能。如果在某些体系结构上一个比另一个快,编译器将以这种方式对其进行优化。

        9
  •  1
  •   jkeys    17 年前

    与0相比,速度非常快,因此这实际上会稍微快一点:

    for (int i = constant; i > 0; --i)
    { 
      //yo
    }
    

    != 在任何情况下,因为它使一个错误更容易检测,并且是将迭代器与非连续数据结构(如链表)一起使用的唯一方法。

        10
  •  0
  •   Brian M. Hunt    17 年前

    我谦恭地建议,在某些体系结构上的某些编译器上,以下内容可以比变体更有效地减少:

    i = constant - 1
    while (--i) {
    }
    

    常数 迭代。

    正如许多评论所建议的那样,编译器可以很好地为您优化循环(编译器优化人员已经花了很多时间考虑它)。易读的代码可能更有价值,但YMMV!

    希望这有助于&干杯

        11
  •  0
  •   chaos    17 年前

    今天,在一个好的编译器上,一点也没有。

    然而,我们不应该盲目地忽视绩效。响应能力仍然很重要,计算时间也很重要。尤其是在编写库代码时,您不知道何时会连续被调用200万次。

    此外,并非所有平台都是平等创建的。嵌入式平台在低(er)处理能力和实时处理要求的基础上,常常会遇到不合标准的优化器。

    在桌面/服务器平台上,重心已经转移到实现更好的扩展算法的封装良好的复杂性。

    只有当它们损害了其他东西,如可读性、复杂性或可维护性时,它们才是不好的。在其他条件相同的情况下,为什么不选择更快的呢?


    曾经有一段时间,在x86上以零结束循环(例如倒计时)实际上可以显著改善紧密循环,例如 DEC CX/JCXNZ

        12
  •  0
  •   Paul Nathan    17 年前

    提供的优化只会针对给定的编译器进行更多优化(可能)。抽象地说,它应该生成相同的代码。

    如果您正在进行微优化(假定满足了进行微优化的要求),那么您的第一步应该是查看生成的程序集,然后是针对您的体系结构的程序集手册。

    你的 编译器/架构组合。

    需要 我的处理器的最后一个周期。传统上,图形或科学计算是你需要这类东西的地方[*]。

    *我知道有一个程序经过几个月的优化 在现代机器上,仍然需要数月的时间来处理数据。单个数据集的运行时在周范围内。有相当多的数据可供使用。。。。

        13
  •  -1
  •   chaos    17 年前

    这绝对是一个微观优化的案例,真的不需要做。