更新最小变量:min(a,b) 与 if 语句

Updating min variable: min(a,b) vs. if statement

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

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];
}

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

什么是课本方式?

不要premature optimizations。除非这是程序的一个极其关键的路径,否则您应该更看重代码的可读性和可维护性,而不是假定的性能提升。

这是Math.min的实现:

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

条件运算符解析为与 if 语句几乎相同的机器代码;对局部变量的赋值实际上是免费的,并且无论如何都发生在机器代码级别,因为所有中间结果都必须存储在某处.

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

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