【问题标题】:Java, optimal calling of objects and methodsJava,对象和方法的最佳调用
【发布时间】:2016-05-08 16:52:01
【问题描述】:

假设我有以下代码:

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

是保持原样还是按如下方式更改它更好:

    private Rule getRuleFromResult(Fact result){
    Rule output=null;
    Rule current==null;
    for (int i = 0; i < rules.size(); i++) {
        current=rules.get(i);
        if(current.getRuleSize()==1){return current;}
        if(current.getResultFact().getFactName().equals(result.getFactName())) output=rules.get(i);
    }
    return output;
}

执行时,程序每次都通过 rules.get(i) 就好像它是第一次一样,我认为,在更高级的示例中(比如说第二个 if)它需要更多的时间和减慢执行速度。我说的对吗?

编辑:一次回答几个 cmets:我知道在这个特定的例子中,时间增益会非常小,但这只是为了得到一般的想法。我注意到我往往有很长的行 object.get.set.change.compareTo... 等等,其中许多重复。在整个代码的范围内,时间增益可能很重要。

【问题讨论】:

  • 但是,在 for 循环之外声明 current 会带来 no 性能提升。如果变量仅在单个代码块内使用,则其定义应位于该代码块中。

标签: java object methods


【解决方案1】:

您的直觉是正确的——将中间结果保存在一个变量中而不是多次重新调用一个方法会更快。通常,性能差异太小而无法衡量,但这样做有一个更好的理由——清晰。通过将值保存到变量中,您可以清楚地表明您打算在任何地方使用相同的值;如果您多次重新调用该方法,则不清楚您是否正在这样做,因为您希望它在不同的调用中返回不同的结果。 (例如,如果您在两次调用之间将项目添加到 listlist.size() 将返回不同的结果。)此外,使用中间变量使您有机会命名值,这可以使代码的意图更清晰。

【讨论】:

  • 并且在调试模式下它被列在变量中并且易于阅读。谢谢!
【解决方案2】:

这两个代码之间唯一的不同是,在第一个代码中,如果值不同,则可以调用两次rules.get(i)

所以第二个版本总体上会快一点,但是如果列表不位的话你不会觉得有什么区别。

【讨论】:

    【解决方案3】:

    这取决于“规则”对象的数据结构类型。如果它是一个列表,那么是的,第二个更快,因为它不需要通过 rules.get(i) 搜索 rules(i)。如果它是一种数据类型,可以让你立即知道 rules.get(i) (就像一个数组)那么它是一样的..

    【讨论】:

      【解决方案4】:

      一般来说是的,如果第一次调用它可能会快一点(我猜是纳秒)。稍后它可能会被 JIT 编译器改进。

      但是你所做的就是所谓的过早优化。通常不应该考虑只提供微不足道的性能改进的事情。 更重要的是以后维护代码的可读性。

      您甚至可以进行更多过早的优化,例如将长度保存在局部变量中,这是由内部的 for each 循环完成的。但同样在 99% 的情况下,这样做是没有意义的。

      【讨论】:

        猜你喜欢
        • 2016-02-11
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多