计数到零,与计算长度相反 - 1

时间:2010-03-23 23:04:44

标签: java micro-optimization

是否建议从长度-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 个答案:

答案 0 :(得分:11)

如果将a.length的结果存储在变量中,则实际上它不会是“更快”。无论如何,很少值得担心这种琐碎操作的表现。专注于方法的可读性。

对我而言,计算更具可读性。

答案 1 :(得分:4)

在我看来,优先考虑常规和可读性(在这种情况下,计数方法)优于抢先优化。根据Josh Bloch的说法,在确定需要进行优化之前,最好不要优化代码。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

我建议你在做这么多的更改之前确保你有基准显示这是一个性能问题。我每天都会阅读最可读的内容(在我看来,它是向上计算的)。

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

答案 4 :(得分:0)

我想说如果有理由相信另一种方式(比如列表中的项目的顺序),那么不要扭曲自己试图遵循惯例(从经验,数量上升) );如果没有 - 让下一个人更容易工作,只是按照惯例。

与0相比,与0相比,真的不应该是一个问题......

答案 5 :(得分:0)

“我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源”,Donald Knuth。

在这种情况下,我认为单独丢失可读性会超过任何可能的性能提升。程序员的工作时间比cpu小时贵得多。

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