代码之家  ›  专栏  ›  技术社区  ›  Mike

Java,对象和方法的优化调用

  •  1
  • Mike  · 技术社区  · 10 年前

    假设我有以下代码:

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

    执行时,程序每次都要经过规则。得到(i)就好像这是第一次,我认为,在更高级的示例中(比如说第二个if),它需要更多的时间并减慢执行速度。我说得对吗?

    编辑:立即回答一些评论:我知道在这个特定的例子中,时间增益将是非常微小的,但这只是为了得到一般的想法。我注意到我倾向于使用很长的行object.get.set.change.compareTo…等,其中许多行重复出现。在整个代码的范围内,时间增益可能是显著的。

    4 回复  |  直到 10 年前
        1
  •  1
  •   Jeff Clites    10 年前

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

        2
  •  0
  •   FiReTiTi    10 年前

    这两种密码的唯一不同之处是,在第一种密码中,您可以拨打两次 rules.get(i) 如果值不同,则返回一个。

    因此,第二个版本总体上要快一点,但如果列表没有显示,您将不会感觉到任何差异。

        3
  •  0
  •   gtwd    10 年前

    这取决于“rules”对象的数据结构类型。如果它是一个列表,那么是的,第二个更快,因为它不需要通过rules.get(i)搜索rules(i)。如果它是允许您立即了解规则的数据类型。get(i)(类似于数组),则它是相同的。。

        4
  •  0
  •   keiki    10 年前

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

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

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