跟踪列表中的最小值有什么更好的做法:
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];
}
虽然第一个代码看起来更容易阅读,但第二个代码可能更有效率?
教科书的方式是什么?
答案 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。除非这是程序的一个非常关键的路径,否则你应该支持代码的可读性和可维护性,而不是假设的性能增益。