【问题标题】:multiple method call with or without explicit variable带或不带显式变量的多方法调用
【发布时间】:2013-05-09 12:58:09
【问题描述】:

我相信这可能是premature optimization 问题或其他问题。

对于下面两个代码sn-ps,

public void doSomething1(final int a) {
    final int b = a -1;
    doSomethingElse(b);
    doSomethingElse(b);
}

public void doSomething2(final int a) {
    doSomethingElse(a - 1);
    doSomethingElse(a - 1);
}

doSomething1 是否优于 doSomething2doSomething2 是否使用了两个不同的 ints?

更新

也许我应该投反对票。但是我有一个实际的代码,它可以像这样读取和写入可变长度位(不是字节)。

final int unsignedLength = length - 1;

return (((readBoolean() ? ~0 : 0) << (length - 1))
        | readUnsignedInt(length - 1));

我只是好奇将(length - 1) 部分更改为unsignedLength

谢谢。

【问题讨论】:

  • 您是在问doSomething1 是否比doSomething2 更好,还是在陈述并要求解释?
  • 其实我想知道哪个更可取。谢谢。
  • 如果b的计算比较复杂,你应该使用doSomething1。否则编译器很可能会小心处理。您应该使用在特定情况下更容易维护的东西。
  • 您能否解释一下您所说的“更好”是什么意思?如果你说的是内存分配,那么第二种方法更好,因为没有像第一种方法final int b那样的额外变量。这两种方法的执行时间通常应该相同。

标签: java


【解决方案1】:

在此级别上尝试和优化通常完全是矫枉过正,因为它将对您的应用程序产生的影响非常小。 doSomething1 应该是更有效的一个,因为它不需要计算 a - 1 两次。然而,这种事情可能会被编译器优化。

不管你应该去doSomething1,因为它更容易维护,即使它有更多的代码,也只有一个地方在计算a - 1。这样可以减少出错的可能性。

【讨论】:

    【解决方案2】:
    public void doSomething1(final int a) {
        final int b = a -1;
        doSomethingElse(b);
        doSomethingElse(b);
    }
    
    public void doSomething2(final int a) {
        doSomethingElse(a - 1);
        doSomethingElse(a - 1);
    }
    

    虽然我认为这不是一个大问题,但doSomething1doSomething2 更有效。正如您所说,这似乎是一个过早的优化问题。为什么要多次计算a-1?看似微不足道,但这些小事加起来。只要效率比内存分配更重要,那么我相信你有你的答案。显然这是一个微不足道的例子,但在效率方面doSomething1 绝对比doSomething2 更可取。

    【讨论】:

      【解决方案3】:

      doSomething1() 使用额外变量 b 其中 doSomething2() 不会创建额外变量。如果您看到一个点,则 doSomething1() 仅执行一次操作 a-1,但 doSomething2() 执行两次。这是我的想法,但我不确定哪个oen更好。

      【讨论】:

      • 你刚刚提到了我想知道的。 variable assignmentoperation
      【解决方案4】:

      doSomething1 比 doSomething2 好吗?

      即使在这个简单的示例中也稍微好一些,但不是在性能方面,而是在可维护性方面,因为您在多个地方没有重复的代码 (a - 1)。

      doSomething2 使用两个不同的整数吗?

      不,这两种情况都一样

      还说这是过早的优化,不应该关注。

      在性能方面,我认为即使在最严格的位上也没有任何区别,因为 a 被声明为 final 并且 b 或 a-1 的表达式在编译后将评估为常量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 2021-03-15
        • 2017-06-11
        • 2010-11-12
        相关资源
        最近更新 更多