【发布时间】:2010-02-02 20:49:46
【问题描述】:
我有这样的方法:
bool MyFunction(int& i)
{
switch(m_step)
{
case 1:
if (AComplexCondition)
{
i = m_i;
return true;
}
case 2:
// some code
case 3:
// some code
}
}
由于 case 语句很多(超过 3 个)并且函数越来越大,我尝试将 case 1 中的代码提取出来,并将其放入这样的内联函数中:
inline bool funct(int& i)
{
if (AComplexCondition)
{
i = m_i;
return true;
}
return false;
}
bool MyFunction(int& i)
{
switch(m_step)
{
case 1:
if (funct(i))
{
return true;
}
case 2:
// some code
case 3:
// some code
}
}
似乎这段代码比原来的要慢得多。 我检查了 -Winline 并且函数是内联的。 为什么这段代码比较慢?我认为这将是等效的。我看到的唯一区别是第二个版本中多了一个条件检查,但我认为编译器应该能够优化它。对吧?
编辑: 有些人建议我应该使用 gdb 来检查两个版本中的每个汇编指令以查看差异。我这样做了。
第一个版本是这样的:
mov
callq (Call to AComplexCondition())
test
je (doesn't jump)
mov (i = m_i)
movl (m_step = 1)
第二个版本,慢了一点,看起来更简单。
movl (m_step = 1)
callq (Call to AComplexCondition())
test
je (doesn't jump)
mov (i = m_i)
xchg %ax,%ax (This is a nop I think)
这两个版本似乎做同样的事情,所以我仍然不知道为什么第二个版本仍然较慢。
【问题讨论】:
-
您的
case块没有break-- 这是故意的吗? -
@GMan :我比较了整个应用程序在此更改前后的执行时间。在此更改之后,整个应用程序的速度降低了 2.5%(是的,在这种情况下,2.5% 是一个大问题)。
-
@OP:实时,2.5%是多少,时钟测时有多准确?
-
@Earlz :整个应用程序的执行时间增加了 2.5%。我没有单独测试这个函数,但由于它只是内部循环的一小部分,我猜它会慢得多。无论如何,对我来说,关键是我不明白为什么编译器不会为这两个版本产生等效的输出。
-
我想应该问一下:你的优化级别是多少?
-03?
标签: c++ performance gcc refactoring inline