java模式:什么时候使用临时变量有意义

2022-09-03 10:15:08

所以我发现自己经常做一些类似以下模式的事情。而不是:

if (map.containsKey(someKey)) {
    Value someValue = map.get(someKey);
    ...
}

为了不遍历地图两次(并且因为我知道我的地图不存储空值),我将执行以下操作:

Value someValue = map.get(someKey);
if (someValue != null) {
    ...
}

在我看来,这是一个有价值的模式,因为操作执行相当数量的操作,并且我认为优化器不够智能,无法优化它。Map

但后来我发现自己在其他情况下也做了类似的模式。例如,我是否应该将结果存储在临时变量中,而不是进行两次调用?显然,如果有副作用,我不能调用两次,但是从优化的角度来看,什么时候只调用一次是有意义的呢?someMethod()someMethod()

if (someObject.someMethod() != null) {
    processSomehow(someObject.someMethod());
}

我知道这与“非建设性”问题接壤,所以我正在寻找能够提出一些事实和参考的答案,而不仅仅是猜想。

  • 什么时候这样做有意义,什么时候不有意义?
  • 我应该如何评估 的“成本”以确定何时应使用临时变量?someMethod()
  • 对于简单的方法,如 get 方法,这是否会妨碍热点编译器或优化器,并实际生成效率较低的代码?

对于后代,我不是在问“我怎样才能提高现有程序的速度”。我试图弄清楚“当我编写未来的代码时,我应该使用什么模式”。

感谢您的任何信息。


答案 1

我应该如何评估 someMethod() 的“成本”,以确定何时应使用临时变量?

只需看一下 的实现。如果它只返回一个字段,就像典型的 getter 方法所做的那样,则无需声明局部变量(性能明智)。如果该方法创建对象、调用数据库或读取文件内容,则通常明智的做法是缓存返回值。someMethod()

就个人而言,我不在乎声明临时变量导致的性能问题。我只是保留返回值,而不是调用一个方法两次。代码更容易阅读和理解(除非你只是命名所有这些变量temp;-) )


答案 2

显然,如果有副作用,我不能调用 someMethod() 两次,但是从优化的角度来看,什么时候只调用一次是有意义的呢?

当您证明使用探查器很重要时。但是,无论如何都要习惯于不连续调用两次方法,因为它会使维护更容易(如果检查发生变化并且您忘记在两个地方更改它怎么办?随意使用临时变量,它们非常便宜。


推荐