Насколько дорогой вызов функции? - PullRequest
1 голос
/ 25 августа 2011

Итак, два случая:

Вариант 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 мс)?

Ответы [ 2 ]

4 голосов
/ 25 августа 2011

Случай 1 будет более эффективным. Величина разницы будет крошечной; мы говорим о разнице между одной инструкцией и парой инструкций - поэтому на любой машине, которая может выполнять несколько миллионов инструкций в секунду, это несущественно.

Первый случай (как правило) будет реализован одной инструкцией условного перехода.

Во втором случае накладные расходы на вызов функции всегда присутствуют в дополнение к условному переходу.

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

1 голос
/ 25 августа 2011

Вызов функции включает в себя помещение чего-либо в кадр стека и последующее удаление этого материала при вызове return.Оба они включают условный jmp (прыжок), так что это не влияет на производительность.Я бы пошел с первым подходом.

...