【问题标题】:Better using a variable or invoke always a method? [duplicate]更好地使用变量或始终调用方法? [复制]
【发布时间】:2018-11-23 11:16:31
【问题描述】:

我有一个返回对象的方法,我需要多次调用两个方法。所有这些都必须写在执行的动作事件中。

您认为哪一个是更好的解决方案?哪个消耗资源少,速度快?

public void actionPerformed(ActionEvent e) { 
    Object obj1 = getObject().getSomething1();
    Object obj2 = getObject().getSomething2();

    doSomething1(obj1);
    doSomething2(obj2);
    doSomething3(obj1);
}

或者更好

public void actionPerformed(ActionEvent e) {
    doSomething1(getObject().getSomething1());
    doSomething2(getObject().getSomething2());
    doSomething3(getObject().getSomething1());
}

【问题讨论】:

  • 这是基于意见的。不过我会说,在许多情况下,我更喜欢将中间数据存储在变量中。从那时起,它使调试变得更容易,您只需检查变量的值。不过,就程序的操作而言,我希望它们在大多数情况下都可以优化为相同的代码。
  • 我相信编译器无论如何都会将第一个版本转换为第二个版本,因此运行时性能不会受到影响。
  • "哪个消耗资源少,速度快?"首先。问题是还有多少资源,多少快,它真的很重要。
  • @varontron 我不太确定。我怀疑 java 编译器能够识别没有副作用的方法,因此对这些方法调用执行 CSE。
  • @varontron 不,编译器肯定不会; JIT 可能,只是,如果一段时间后它可以解决缺乏副作用的问题。

标签: java performance


【解决方案1】:

我想说,计算机程序员在没有得到提示的情况下绝不应该担心这一点。您应该始终关注更具可读性的内容。

如果您在运行代码时遇到性能问题,那么您需要返回并检查是否存在显着的性能差异。无论如何,我相信你不会找到一个。现代编译器非常擅长优化这样的事情。

【讨论】:

  • 致那些将此答案标记为删除的人。答案可以改写为,哪个更好就是您发现更具可读性的那个。这是一个完全有效的答案。
【解决方案2】:

性能方面,主要靠getSomething1()处理。如果不进行计算或进行轻计算,这两种方式应该具有大致相同的性能。
如果处理更繁重,您可能会有一些差异,但这仍然取决于应用程序框架中执行的调用次数。

除了在您的情况下实际上不是问题的性能之外,您还应该首先关注其他领域,例如潜在的副作用和代码质量。
副作用:该方法是否会产生您不想重复的副作用? 在这种情况下,请确保您调用它一次。
代码质量:通常应避免代码重复,第二次这样做,但同时也应避免引入比要求更多的变量。那么哪种方式更好呢?我认为我们应该让整个代码以某种方式或另一种方式进行论证。

请注意,您还可以通过引入接受对象的方法来选择第三个选项:它避免了重复并限制了声明变量的数量:

doSomething(getObject());

private void doSomething(Foo foo){
   foo.getSomething1();
   foo.getSomething2();
   foo.getSomething1();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 2015-12-30
    • 2016-10-02
    • 2012-08-18
    • 1970-01-01
    • 2015-10-05
    • 2015-12-12
    • 2012-11-10
    相关资源
    最近更新 更多