Gra*_*ray 13 java design-patterns
所以我发现自己经常做类似下面的模式.代替:
if (map.containsKey(someKey)) {
Value someValue = map.get(someKey);
...
}
Run Code Online (Sandbox Code Playgroud)
为了不遍历地图两次(因为我知道我的地图不存储空值),我会这样做:
Value someValue = map.get(someKey);
if (someValue != null) {
...
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这似乎是一个有价值的模式,因为Map操作执行了大量的操作,而我认为优化器不够智能,无法优化它.
但后来我发现自己在其他情况下也会做类似的模式.例如,我应该将someMethod()结果存储在临时变量中而不是两次调用吗?显然someMethod(),如果有副作用,我不能再调用两次但是从优化的角度来看它只调用一次是否有意义?
if (someObject.someMethod() != null) {
processSomehow(someObject.someMethod());
}
Run Code Online (Sandbox Code Playgroud)
我知道这与"非建设性"问题接壤,因此我正在寻找能够提供一些事实和参考的答案,而不仅仅是猜想.
someMethod()确定何时应使用临时变量的"成本" ?对于子孙后代,我不是在问"我怎样才能提高现有程序的速度".我试图找出"当我编写未来代码时我应该使用什么模式".
感谢您提供任何信息.
And*_*s_D 11
我应该如何评估someMethod()的"成本"来确定何时应该使用临时变量?
简单看一下执行情况someMethod().如果它只返回一个字段 - 就像通常的getter方法那样,就没有必要声明一个局部变量(性能明智).如果方法创建对象,调用数据库或读取文件内容,则通常明智地缓存返回值.
就个人而言,我并不关心因宣布临时变量而导致的性能问题.我只保留返回值而不是两次调用方法.代码更容易阅读和理解(除非你只是命名所有这些变量temp;-))
显然,如果有副作用,我不能两次调用someMethod()但是从优化的角度来看它只调用一次才有意义吗?
当你使用分析器证明它很重要时.但是习惯连续两次不调用方法,因为它会使维护变得更容易(如果检查发生变化,你忘了在两个地方都改变它?).大量使用临时变量,它们非常便宜.
作为一般规则,我需要多次使用本地var.你可以给那个本地var一个漂亮的名字,每个人都知道这个var是什么.从性能的角度来看:本地变量很便宜,方法也许很复杂.
特别是当someMethod()像同步方法一样昂贵时,这应该会更好.但是什么时候someMethod()是同步方法,那么它应该被多个线程并发调用,然后调用方法两次或者存储它的返回值并重用它会有所不同......
...另一点需要提及的是,后续方法调用不必返回相同的数据.因此,带/不带局部变量的示例并不总是有效替代后续方法调用.但我认为你已经考虑过了.
| 归档时间: |
|
| 查看次数: |
3125 次 |
| 最近记录: |