2011-07-07 16 views
1

编码时我经常会遇到这个问题。调用方法/函数两次Vs.保存到变量中,然后调用一次

以下哪个示例是更好的做法?我知道其他因素会影响其中一个是否更好。但总的来说,一个优于另一个。

if(object.getA().Value != null) { 
    return object.getA().Value; 
} 
return null; 

比。

​​

下面是另一个类似的例子:

var a = object.method(x).Value; 
var b = object.method(x).Key; 

比。

var y = object,method(x); 
var a = y.Value; 
var b = y.Key; 

在我的问题换句话说就是:

是更好地调用方法两次,少了一个变量? 或 将它保存到一个变量并调用该方法两次更好吗?

当然,如果该方法导致大量的处理,它可能是聪明的,只需调用一次,但对于一般情况下,方法不是太苛刻,变量的空间不是太大,哪一个更好为什么?或者哪一个是另一个的优点?

它们之间的差异可能不会产生很大的差异,但我试图找到更好的实践,并希望听到一些有经验的程序员的输入。

非常感谢

回答

1

在变量中缓存值是一个基本的优化(与memoizing有关)。

当真正有必要的时候,如果函数的第二个调用在堆栈上的时间很长。

例如,如果第二次调用在堆栈中占用10%或20%的时间,那么通过缓存第一个结果可以节省多少总时间。

You can keep doing things like that, until the code is as fast as possible.

如果我可以举个例子,很久以前我工作的一个应用程序,有这样的代码:

if (!Done()){ 
    do some stuff 
} 
.... 
if (!Done()){ 
    do some other stuff 
} 

由于Done()是如此短,干净,简单的函数调用,它叫了很多。 不要紧,它做了很多事情,包括从数据库中查询大量的东西,并把它扔掉。 Stackshots立即发现问题。

+0

感谢您的建议,学习新东西或学习更好,欢呼 – tif

1

这取决于如果你想是线程安全的,如果函数可以调用之间改变。

例如与

if(object.getA().Value != null) { 
    return object.getA().Value; 
} 
return null; 

如果属性getter Value实施第二次调用返回一个空你将有一个不同的答案。它可以通过实现该方法在第二次调用时返回null,或者如果另一个线程在if和return语句之间引发了将该属性的结果设置为null的更新。

该测试实际上是多余的,因为如果它为空则返回null。我猜你的意思是if (object.getA() != null)。然后,前面的段落仍然适用,但getA()而不是Value,但如果getA()在第二次调用时返回null,则if体将抛出空引用异常。

所以这一切都取决于您是否担心值之间的调用会发生变化。

1

一般规则:避免额外的变量(不必要地引入状态)。 (打破规则,如果调用该函数两次会增加太多的开销)