反复呼唤 - 编码实践

时间:2011-04-03 08:48:09

标签: c++ performance

你更喜欢哪一个? (当然getSize不会进行任何复杂的计数,只返回成员值)

void method1(Object & o)
{
    int size = o.getSize();

    someAction(size);
    someOtherAction(size);
}

void method2(Object & o)
{
    someAction(o.getSize());
    someOtherAction(o.getSize());
}

我知道我可以测量哪一个更快但我想要一些评论......不只是执行时间相关......例如。如果你更喜欢method2,你最多使用o.getSize多少次,你使用method1方式的数字是多少? 任何最佳做法? (想象甚至不同的类型然后int) TY

6 个答案:

答案 0 :(得分:10)

我会选择方法1,不仅因为它可能稍微快一些,而且主要是因为这意味着我不必担心被调用的方法是否有任何副作用。

另外,如果在多线程程序中调用它,这可以确保我总是使用 my 大小的值 - 否则它可能在两次调用之间发生了变化。当然,有些情况下您可能明确地想要注意到这种变化,在这种情况下使用方法2。

(是的,根据其他答案,将size设为const int,以确保在通过引用其他内容传递时不会对其进行修改。

答案 1 :(得分:9)

由于您在调用sizesomeAction()时不希望更改someOtherAction()(因为它不是函数的返回值时),请考虑:

void method3(const Object& o)
{
    const int size = o.getSize();

    someAction(size);
    someOtherAction(size);
}

getSize()可能很简单,或者可能进行了昂贵的计算。此外,在osomeAction()的通话之间,另一个主题可能会更改someOtherAction()的尺寸。

答案 2 :(得分:1)

我更喜欢第一种方法。重复调用函数对我来说似乎并不好,特别是如果返回的值每次都相同。第一种方法也避免了重复调用函数的开销。

答案 3 :(得分:1)

当我调用一个多次返回多次(大约2-3次)的函数时,我通常将返回的值保存在局部变量中。那是因为我更喜欢节目速度而不是节省内存。不是说记忆不重要。这取决于具体情况。 调用一个不需要花费大量时间执行的函数并不费时,但是多次调用多个循环的函数会使程序长时间等待。

答案 4 :(得分:1)

第一个将消除对函数的不必要调用,因此我更喜欢method1(),因为代码看起来也更清晰。

但是,您应该知道,根据具体情况,它们可能会产生不同的结果。比如,如果someAction()中的大小发生变化,并且您使用存储在size变量中的值,则可能无法获得所需的结果。

答案 5 :(得分:0)

当结果不会改变时反复调用任何函数是一种浪费,所以我总是采用第一种方法。