假设我有以下代码:
`watch_date` DESC
最好保持原样或按如下方式更改它:
private Rule getRuleFromResult(Fact result){
Rule output=null;
for (int i = 0; i < rules.size(); i++) {
if(rules.get(i).getRuleSize()==1){output=rules.get(i);return output;}
if(rules.get(i).getResultFact().getFactName().equals(result.getFactName())) output=rules.get(i);
}
return output;
}
执行时,程序每次都通过rules.get(i),就好像这是第一次,我认为,在更高级的例子中(让我们说如第二次),它需要更多的时间和减慢执行速度。我是对的吗?
编辑:一次回答几条评论:我知道在这个特定的例子中,时间收益会非常微小,但这只是为了得到一般的想法。我注意到我倾向于有很长的行object.get.set.change.compareTo ...等等,其中很多都重复了。在整个代码的范围内,时间收益可能很大。
答案 0 :(得分:1)
你的直觉是正确的 - 将中间结果保存在变量中而不是多次重新调用方法会更快。通常,性能差异太小而无法衡量,但实现这一目标的更好理由 - 清晰度。通过将值保存到变量中,可以清楚地表明您打算在任何地方使用相同的值;如果您多次重新调用该方法,则不清楚您是否这样做,因为您希望它在不同的调用中返回不同的结果。 (例如,如果您在调用之间向list.size()
添加了项目,list
将返回不同的结果。)此外,使用中间变量可以为您命名值,这可以使代码的意图更清晰。
答案 1 :(得分:0)
两个代码之间唯一不同的是,如果值不同,则可以在第一个代码rules.get(i)
中调用两次。
所以第二个版本通常会快一点,但如果列表没有位,你就不会有任何区别。
答案 2 :(得分:0)
这取决于“规则”对象所属的数据结构的类型。如果它是一个列表,那么第二个更快,因为它不需要通过rules.get(i)搜索规则(i)。如果它是一个允许你立即知道rules.get(i)(如数组)的数据类型,那么它是相同的..
答案 3 :(得分:0)
总的来说,如果是第一次调用它可能会快一点(我估计是纳秒)。稍后,它可能会被JIT编译器改进。
但你所做的就是所谓的过早优化。通常不应该考虑只提供微不足道的性能改进的事情。 更重要的是稍后维护代码的可读性。
您甚至可以进行更多的过早优化,例如在局部变量中保存长度,这由内部的for循环完成。但同样在99%的情况下,这样做是没有意义的。