调用方法/函数两次。保存到变量并调用一次

时间:2011-07-07 15:18:48

标签: optimization variables memory methods

我经常在编码时遇到这个问题。

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

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

Vs以上。

string x = string.null;
x = object.getA().Value;
return (x != null) ? x : null;

这是另一个类似的例子:

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

Vs以上。

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

换句话说,我的问题是:

两次调用方法并减少一个变量是否更好? 要么 将它保存到变量并调用该方法两次更好吗?

当然,如果该方法导致大量处理,那么调用它可能是明智的,但对于一般情况下,方法不是太苛刻且变量的空间不是太大,哪一个更好,为什么?或者哪一个是其中一个的好处?

它们之间的差异可能没有太大的区别,但我正在努力寻找更好的实践,并希望听到一些有经验的程序员的意见。

非常感谢

3 个答案:

答案 0 :(得分:2)

在变量中缓存值是一个基本优化(与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立即发现问题。

答案 1 :(得分:1)

这取决于你是否想要线程安全,以及函数是否可以在不同的调用之间改变。

e.g。与

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

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

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

所以关注你是否担心调用之间的价值变化。

答案 2 :(得分:1)

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