Локальные переменные в сборке: они быстрее, чем глобальные переменные? - PullRequest
0 голосов
/ 16 октября 2011

Мне было интересно, если локальные переменные в сборке быстрее, чем глобальные переменные, которые мы используем.Контекст для этого заключается в том, что я изучаю некоторую 2-мерную анимацию, используя API Win32, из книги.Автор использует функцию для инициализации (создания, регистрации, отображения и обновления окна) главного окна программы.Я написал эту функцию в asm (просто чтобы попрактиковаться в asm).Итак, мне было интересно, есть ли какое-то преимущество в производительности, поскольку в используемой мной функции asm структура WNDCLASSEX была создана локально (в стеке).Я знаю, что локальные переменные в ассемблере должны быть быстрее, но, пройдя разборку для другой программы (полностью в cpp), я заметил, что компилятор также создает WNDCLASSEX локально.Это смутило меня по поводу темы.Поэтому я хочу знать, есть ли разница в производительности между кодом asm и кодом C ++.

Devjeet

Ответы [ 3 ]

4 голосов
/ 16 октября 2011

Вершина стека затронута большим количеством кода. Это означает, что вершина стека обычно находится в кэше процессора. Доступ к этому будет быстрее, чем доступ к другим областям памяти (от .bss и т. Д.).

Но для такой функции, как CreateWindow, которая вызывается всего несколько раз для каждой программы, это на самом деле не имеет значения. Разница составляет менее нескольких сотен тактов процессора. Для других частей кода разница может быть более заметной. Но важно отметить, что если вы выполняете одно и то же несколько раз с одним и тем же фрагментом данных, эти данные также попадают в кэш ЦП и, таким образом, разница в производительности будет сведена на нет.

3 голосов
/ 16 октября 2011

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

2 голосов
/ 16 октября 2011

Не имея вашего кода для суждения, у меня есть совет:

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

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

Еще одна плохая вещь с кодированием со сборкой в ​​языке высокого уровня - это предотвращение переносимости кода.

Примечание: Тем не менее, есть некоторые машины и системы, кодирование по которым полезно для них.

...