У меня есть такой метод:
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) и функция становится большой, я попытался извлечь код в случае 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)
Эти две версии, кажется, делают одно и то же, поэтому я до сих пор не знаю, почему вторая версия все еще медленнее.