更新分钟变量:分钟(A,B)与if语句

问题描述:

什么是更好的做法是跟踪最小的名单:更新分钟变量:分钟(A,B)与if语句

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

如果我们在谈论最佳实践, [不要使用多线括号ifs](http://cafe.elharo.com/blogroll/braceless-if-considered-harmful/) – 2015-01-31 20:42:39

这是Math.min实现:

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

条件运算符解析为大致相同的机器代码的if语句;因为所有中间结果都必须存储在的某个地方,因此分配给本地变量几乎是免费的,并且无论如何都会发生在机器代码级别。

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

但是,最终的判断是测量您的代码正在运行。如果–且仅当–出现实际性能问题,则应首先使用分析器查看确切时间花在何处;永远不要相信你的猜测。然后,如果确实发现这个特定的循环是瓶颈,你可以考虑用这两个选项进行测试,看看它是否有什么不同。

不要做premature optimizations。除非这是该程序的一个非常关键的途径,否则您应该倾向于代码的可读性和可维护性,而不是假定的性能增益。