C ++ Возвращение производительности

У меня есть вопрос о производительности. Я думаю, что это может также относиться к другим языкам (не только C ++).

Представь, что у меня есть эта функция:

int addNumber(int a, int b){
int result = a + b;
return result;
}

Есть ли улучшение производительности, если я напишу код выше, как это?

int addNumber(int a, int b){
return a + b;
}

У меня есть этот вопрос, потому что вторая функция не объявляет третью переменную. Но обнаружит ли компилятор это в первом коде?

3

Решение

Ответить на этот вопрос вы можете посмотрите на сгенерированный ассемблерный код. С -O2, x86-64 gcc 6.2 генерирует абсолютно одинаковый код для обоих методов:

addNumber(int, int):
lea     eax, [rdi+rsi]
ret
addNumber2(int, int):
lea     eax, [rdi+rsi]
ret

Только без оптимизации, есть разница:

addNumber(int, int):
push    rbp
mov     rbp, rsp
mov     DWORD PTR [rbp-20], edi
mov     DWORD PTR [rbp-24], esi
mov     edx, DWORD PTR [rbp-20]
mov     eax, DWORD PTR [rbp-24]
add     eax, edx
mov     DWORD PTR [rbp-4], eax
mov     eax, DWORD PTR [rbp-4]
pop     rbp
ret
addNumber2(int, int):
push    rbp
mov     rbp, rsp
mov     DWORD PTR [rbp-4], edi
mov     DWORD PTR [rbp-8], esi
mov     edx, DWORD PTR [rbp-4]
mov     eax, DWORD PTR [rbp-8]
add     eax, edx
pop     rbp
ret

Однако сравнение производительности без оптимизации не имеет смысла

8

Другие решения

В принципе нет разницы между этими двумя подходами. Большинство компиляторов обрабатывали этот тип оптимизации в течение нескольких десятилетий.

Кроме того, если функция может быть встроенной (например, ее определение видно компилятору при компиляции кода, использующего такую ​​функцию), большинство компиляторов полностью исключают функцию и просто генерируют код, чтобы добавить две переданные переменные и сохранить результат. как требуется вызывающим абонентом.

Очевидно, что приведенные выше комментарии предполагают компиляцию с соответствующими настройками оптимизации (например, не выполнять отладочную сборку без оптимизации).

Лично я бы не стал писать такую ​​функцию в любом случае. В звонилке проще написать c = a + b вместо c = addNumber(a, b)таким образом, наличие подобной функции не приносит никакой пользы ни программисту (попытка понять), ни программе (производительность и т. д.). Вы также можете написать комментарии, которые не дают полезной информации.

 c = a + b;    //   add a and b and store into c

Любой уважающий себя рецензент кода будет горько жаловаться на неинформативные функции или неинформативные комментарии.

Я бы использовал такую ​​функцию только в том случае, если ее имя передавало какое-то особое значение (т. Е. Больше, чем просто добавление двух значений) для приложения.

 c = FunkyOperation(a,b);

int FunkyOperation(int a, int b)
{
/*  Many useful ways of implementing this operation.
One of those ways happens to be addition, but we need to
go through 25 pages of obscure mathematical proof to
realise that
*/

return a + b;
}
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector