В общем, очень сложно сделать лучше, чем ваш компилятор, с простым кодом, подобным этому.
Компилятор, когда сталкивается с операцией подстановки целых чисел, обычно выдает код, подобный этому:
mov eax, [x]
mov ebx, [y]
mov [x], ebx
mov [y], eax
Прежде чем пытаться переопределить, сначала проверьте, что на самом деле генерирует компилятор.Если это что-то вроде этого, не беспокойтесь идти дальше;Вы не сможете добиться большего успеха, чем это.Более того, если вы оставите это для компилятора, он может, если сразу после этого использовать эти переменные, выбрать повторное использование одного из этих регистров, чтобы также сэкономить на переменных загрузках / хранилищах.Это невозможно при ручной сборке;компилятор должен перезагрузить переменные после черного ящика, который закодирован вручную.
Обратите внимание, что последовательность push / push / pop / pop, вероятно, будет намного медленнее;он не только добавляет дополнительные четыре операции с памятью в стек, но также вводит зависимости от указателя стека, исключая любую возможность конвейерной обработки.С простой последовательностью mov
возможно, по крайней мере, выполнить пару чтений и пару записей параллельно, если они находятся в разных банках памяти, или одна находится в кэше, и т. Д. Это также не приводит к остановкам в стекеуказатель в последующем коде.
Таким образом, вы не должны пытаться микрооптимизировать стоимость обмена;вместо этого уменьшите количество выполненных обменов .Существует множество алгоритмов сортировки , каждый из которых имеет немного отличающиеся характеристики.Вы можете обнаружить, что некоторые из них лучше (вызывают меньше свопов) в вашем наборе данных, чем другие.