更新min变量:min(a,b)vs if语句

时间:2015-01-31 20:35:46

标签: java performance

跟踪列表中的最小值有什么更好的做法:

int minVal = a[0];
for (int i = 1; i < a.length; i++) {
   minVal =  Math.min(minVal, a[i]);
}

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

虽然第一个代码看起来更容易阅读,但第二个代码可能更有效率?

教科书的方式是什么?

2 个答案:

答案 0 :(得分:3)

这是Math.min

的实施
public static int min(int a, int b) {
    return (a <= b) ? a : b;
}

条件运算符解析为与if语句大致相同的机器代码;对本地变量的赋值几乎是免费的,无论如何都要在机器代码级别进行,因为所有中间结果必须存储在某处

如果在执行程序时检测到循环是一个热点,JIT编译器会将Math.min的完整代码内联到循环中。此时,您正在考虑的两个选项之间几乎没有差异。

但是,最终的判断是运行代码的度量。如果 - 并且仅当 - 您看到实际的性能问题,您应该首先使用分析器来查看确切花费的时间;永远不要相信你的猜测。然后,如果事实证明这个特定的循环是瓶颈,你可以考虑使用这两个选项进行测试,看看它是否有任何区别。

答案 1 :(得分:1)

不要做premature optimizations。除非这是程序的一个非常关键的路径,否则你应该支持代码的可读性和可维护性,而不是假设的性能增益。