Производительность встроенных функций - PullRequest
2 голосов
/ 27 апреля 2011

У меня небольшая проблема с производительностью встроенной функции. Рассмотрим следующий код: -

inline int left(int x) {
    return 2*x;
}
inline int right(int x) {
    return 2*x+1;
}

main() {
    for(int i=0;i<200000000;i++) {
        int L=left(i);
        int R=right(i);
    }
}

Это при компиляции и выполнении (с флагом -finline-function и без него) на моем компьютере занимает около 1,90 секунды. Однако, когда я заменяю встроенные функции макросами, это занимает всего 1,26 секунды. Хотя весьма маловероятно, что функция будет выполняться 200 миллионов раз, но все же я хотел бы знать, можно ли в любом случае добиться такого рода производительности с помощью встроенных функций?

РЕДАКТИРОВАТЬ: После получения нескольких оскорбительных комментариев я понял, что я не очень ясно с моим вопросом. Я просто хотел узнать, как добиться такой же производительности без использования каких-либо флагов оптимизации. Конечно, более разумно просто использовать -O2 или -O3, я просто хотел научиться.

Ответы [ 2 ]

13 голосов
/ 27 апреля 2011

Встроенные функции и макросы должны иметь одинаковую производительность, поэтому ваши функции, вероятно, не становятся встроенными. Попробуйте добавить

__attribute__((always_inline))

к объявлению вашей функции. (Также см. Gcc docs здесь ):

Как правило, функции не встроены если не указана оптимизация. За функции объявлены встроенными, это атрибут встроен в функцию, даже если уровень оптимизации не указан.

10 голосов
/ 27 апреля 2011

Для меня с оптимизацией GCC 4.2.1 при -O3 нет разницы во времени выполнения между встроенной функцией и макросом. В любом случае это 0,185 с, и я серьезно сомневаюсь, что мой ноутбук в 10 раз быстрее вашей машины.

Запуск g++ -S дополнительно показывает, что объектный код идентичен.

Я настроил int L и int R на volatile int, чтобы заставить его фактически выполнить цикл.

Редактировать: Цель более низких настроек оптимизации - помочь отладке. Одна из причин, по которой встроенная функция может быть медленнее на -O0, заключается в том, что компилятор гарантирует, что все переменные находятся в согласованном состоянии, которое вы можете остановить и посмотреть в отладчике, на строку кода внутри встроенной функции.

Иногда оптимизация делает невозможным разрыв внутри или пошаговое выполнение встроенной функции, подобно макросу.

...