Как встраивание в C на самом деле может замедлить эту программу? - PullRequest
1 голос
/ 03 мая 2011

Чтобы заставить функцию не быть встроенной, которая потребляла 46% времени выполнения, я использовал __attribute__((noinline)) для нее и скомпилировал код с gcc -Wall -Winline -O2 (эти плюс -g - это то, что используется Makefile - я также вижу примерно такой же эффект при использовании -g) при использовании gcc 4.5.2. Я обнаружил, что программа с не встроенной функцией более чем на 20% быстрее оригинальной. Кто-нибудь знает, почему это может быть?

Позвольте мне предоставить более подробную информацию. Программа, в которой это произошло, является последней версией утилиты сжатия bzip2 для Linux. Ключевая функция (generateMTFValues ​​находится в compress.c) в программе - это та, которая выполняет преобразование «Переместить в фронт». Эта функция вызывается только одной функцией в программе.

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

Ответы [ 2 ]

6 голосов
/ 04 мая 2011

Это может замедлить работу программы, потому что полученный код больше и может привести к большему количеству пропусков кэша инструкций ЦП.

4 голосов
/ 03 мая 2011

Это полный WAG (Wild Ass Guess), основанный на почти идеальном незнании.

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

Как я уже сказал, просто WAG.

...