Почему мы можем навсегда избежать разливов регистров, переназначая переменные в коде C? - PullRequest
0 голосов
/ 23 апреля 2019

Обобщенные вопросы:

  1. Как узнать, когда необходимо переназначить переменную в коде C, чтобы избежать разлития регистров?Зависит ли ответ от структуры процессора целевых машин и компилятора?
  2. Если я добавлю несколько новых переменных в исходный код, нужно ли проверять строку, чтобы избежать разливов регистров, все еще полезно?

В CPython я обнаружил строку , пытающуюся избежать разливов регистров путем переназначения переменной.Изменение строки можно проследить до коммита , созданного в 2015 году. Мне любопытно узнать о принципе линии.

Когда пользователь запускает Python, загружается много данных и кодов.в память или регистры.Почему эта строка кода для предотвращения утечки регистров все еще работает, если другие части кода CPython изменены?CPython постоянно строится на различных архитектурах ЦП и разных операционных системах.Почему в комментарии к коммиту упоминаются только типы компиляторов?

1 Ответ

0 голосов
/ 23 апреля 2019

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

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

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

...