2011-08-25 39 views
1

所以,两种情况:函数调用的代价是多少?

案例1:

if (doSomething) doFunction(); 
//... 
void doFunction() { 
    // ... do something time consuming 
} 

案例2:

doFunction(); 
//... 
void doFunction() { 
    if (!doSomething) return; 
    // ... do something time consuming 
} 

这是非常之内的时间敏感的环境中(大约0.1毫秒就会有很大的不同); doFunction()经常被称为(约100次的次序),并且大多数情况下不是,doSomething是错误的。似乎很明显,案例1会更有效率,但多少?或者它会不会有所作为(大约0.01毫秒)?

+3

通过探查器运行,然后你会得到你的答案。 –

+0

我希望这就是这么简单...我也想知道在这种情况下g ++可能会做什么 – polyglot

+0

@polyglot:我用g ++试过了两种情况的非常简单的版本,结果非常相似。我怀疑它足够聪明来优化第二种情况。 – sje397

回答

4

案例1会更有效率。差异的幅度很小,我们正在谈论一条指令和几条指令之间的差异 - 所以在任何可以每秒执行几百万条指令的机器上,这是微不足道的。

第一种情况将(通常)由单个条件跳转指令来实现。

在第二种情况下,除条件跳转外,函数调用的开销始终存在。

无论如何,编译器可能会优化第二种情况,使它们等价。您可以通过查看编译器输出来检查,也可以通过自己计时来检查。

+0

除函数被内联外。然后它几乎是一样的。 –

1

函数调用包括将东西放在堆栈框架上,稍后在返回时弹出该东西。他们都涉及条件jmp(跳转),所以这不会影响性能。我会采用第一种方法。

相关问题