1

是否建议在小循环中(在可能的情况下)从长度 - 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 的未来改进来优化。有什么想法吗?

4

6 回答 6

11

如果您将 a.length 的结果存储在变量中,那么实际上它不会“更快”。无论如何,很少需要担心这种微不足道的操作的性能。关注方法的可读性。

对我来说,计数更具可读性。

于 2010-03-23T23:08:50.833 回答
4

在我看来,与先发制人的优化相比,支持约定和可读性(在这种情况下是计数方法)要好得多。根据 Josh Bloch 的说法,在您确定需要优化之前,最好不要优化您的代码。

于 2010-03-23T23:11:11.927 回答
3

尽管有可能丢弃一条机器代码指令,但向下计数往往会更慢。在现代,性能并不是那么简单。编译器针​​对前向循环进行了优化,因此您的反向循环可能会错过优化。缓存硬件是为正常的前向扫描而设计的。所以不要担心这种微优化(如果你发现自己处于真正需要的情况,请测量)。

于 2010-03-24T02:16:26.390 回答
1

我建议你在做太多这样的改变之前确保你有基准测试表明这是一个性能问题。任何一天我都会选择最易读的(在我看来,它是向上计数的)。

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

于 2010-03-23T23:08:07.610 回答
0

我想说,如果有理由计算一种方式与另一种方式(比如列表中项目的顺序),那么不要纠结于试图遵循惯例(根据经验,数数);如果没有 - 让下一个人更容易工作,并按照惯例行事。

比较 0 与比较 int 不应该真的是一个问题......

于 2010-03-23T23:31:47.130 回答
0

“我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源”,Donald Knuth。

在这种情况下,我认为任何可能的性能提升都将被单单可读性的损失所抵消。程序员的时间比 CPU 时间贵得多。

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

于 2010-03-24T15:52:48.960 回答