c++ - 为什么即使函数是内联的,这段代码也会变慢?

标签 c++ performance gcc refactoring inline

我有这样的方法:

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)

这两个版本做的好像是一样的,所以我还是不知道为什么第二个版本还是比较慢。

最佳答案

只需逐步完成即可。下个断点,进入反汇编 View ,开始单步执行。

所有的谜团都会消失。

关于c++ - 为什么即使函数是内联的,这段代码也会变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2187581/

相关文章:

无法使用 frama-c 分析 openmp 代码

c++ - 具有左值的C++ std::move()性能明智

c++ - 在没有类型注册或 RTTI 的情况下在 C++ 中实现 type_id(T)

c++ - 在断点处而不是最初在 GDB 中发送管道输入

ios - 在模拟器中测量方法相对速度的简单方法?

python - 依赖于 gcc 的 pyzmq 安装错误

C++ 编译时类型检查

performance - 有没有更快/更紧凑的方法从方形中获取索引? (Matlab)

performance - Matlab + CUDA 求解矩阵向量方程 A*x=B 速度慢

objective-c - 使用旧 gcc : CFLAG adjustment? 构建 Debian/Ubuntu 软件包