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

倒计时到零,而不是倒计时到长度-1

  •  1
  • helpermethod  · 技术社区  · 16 年前

    建议以小循环(如有可能)的形式从长度-1向下计数到零吗? 而不是数到长度-1?

    1.)倒计时

    for (int i = a.length - 1; i >= 0; i--) {
        if (a[i] == key) return i;
    }
    

    2)计数

    for (int i = 0; i < a.length; i++) {
        if (a[i] == key) return i;
    }
    

    第一个比第二个快一点(因为与零相比更快),但在我看来更容易出错。此外,第一个可能无法通过未来对JVM的改进进行优化。有什么想法吗?

    6 回复  |  直到 16 年前
        1
  •  11
  •   Kevin    16 年前

    如果将a.length的结果存储在variable中,那么实际上不会更快。在任何情况下,都不值得担心这样一个微不足道的操作的性能。注意方法的可读性。

    对我来说,数数更易读。

        2
  •  4
  •   Daniel    16 年前

    在我看来,比起先发制人的优化,更倾向于约定和可读性(在本例中是计数方法)。根据JoshBloch,最好不要优化代码,直到确定需要优化为止。

        3
  •  3
  •   Tom Hawtin - tackline    16 年前

    向下计数的速度往往较慢,尽管可能会丢失一条机器代码指令。在现代,表演不是那么简单。编译器具有面向前向循环的优化功能,因此反向循环可能会错过优化功能。高速缓存硬件是为正常正向扫描而设计的。所以不要担心这种微观的优化(如果你发现自己处于一种你真正需要的情况下,测量)。

        4
  •  1
  •   Laserallan    16 年前

    我建议您在进行如此多的更改之前,确保有基准测试表明这是一个性能问题。我会去读任何一天最可读的(在我看来,这是一个向上计数)。

    如果您正在进行微优化,并且不相信编译器会做正确的事情,那么也许您应该考虑在第二个循环中的变量中缓存a.length,以避免间接寻址。

        5
  •  0
  •   Fry    16 年前

    我会说,如果有理由一种方式来计算与另一种方式(比如说列表中的项目顺序),那么不要为了遵守约定而绞尽脑汁(根据经验,数一数);如果没有——让下一个人更容易工作,只需遵守约定。

    比较0和比较int不应该是一个问题…

        6
  •  0
  •   zckman    16 年前

    “我们应该忘记小效率,比如97%的时间:过早的优化是万恶之源”,唐纳德·克努斯说。

    在这种情况下,我认为任何可能的性能提升都会被仅仅丧失可读性所抵消。编程时间比CPU时间要贵得多。

    P.S.:为了进一步提高性能,您应该考虑将不等式测试为零。但要注意空数组;)

    推荐文章