更好的做法是跟踪列表中的最低值:
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];
}
虽然第一段代码似乎更容易阅读,但第二段代码可能更有效?
课本的方式是什么?
发布于 2015-01-31 20:40:33
这是Math.min
的实现
public static int min(int a, int b) {
return (a <= b) ? a : b;
}
条件运算符解析成与if语句几乎相同的机器代码;分配给局部变量实际上是免费的,并且无论如何在机器代码级别发生,因为所有中间结果都必须存储在某个地方。
如果您的循环在执行程序时被检测为热点,JIT编译器将把完整的Math.min
代码内联到您的循环中。在这一点上,你正在考虑的两种选择几乎没有区别。
然而,最终的判断是衡量您的代码运行情况。如果--而且只有当--您看到了实际的性能问题时,您应该首先使用分析器来查看具体的时间花费在哪里;永远不要相信您的猜测。然后,如果发现这个特定的循环是瓶颈,您可以考虑使用这两个选项进行测试,以确定它是否有任何不同。
发布于 2015-01-31 20:40:04
不要做过早优化。除非这是程序的一条极其关键的路径,否则您应该倾向于代码的可读性和可维护性,而不是假定的性能增益。
https://stackoverflow.com/questions/28256246
复制相似问题