"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора a[i] = 0;
дает приведенный ниже ассемблерный код процессора 80x86. Он гораздо быстрее, чем его аналог, записанный в виде цикла или набора инструкций непосредственной засылки в память, имеющего соответствующую длину: mov CX,10000 mov i,CX sub AX,AX mov DI,offset a push DS pop ES cld rep stosw "Минимизация заголовков вызова функций" может существенно уменьшить время выполнения в структурированной программе. При вызове функции параметры передаются вызываемой подпрограмме в стеке, находящемся в оперативной памяти. Набор инструкций некоторых процессоров содержит инструкции, которые поддерживают потребности Си и других структурированных языков высокого уровня в установке адресации фрейма стека перед выполнением кода функции и восстановлении стекового фрейма перед завершением. Начиная с процессора Intel 80186, семейство микропроцессоров 80x86 предоставляет инструкции ENTER и LEAVE для обработки вызовов функций. Полезность инструкции ENTER снижается, так как ее выполнение занимает гораздо больше временных циклов процессора, чем выполнение последовательности команд, осуществляющих засылку в стек базового указателя и вычитание необходимого количества байт для фрейма из указателя стека. является задание корректно определенного протокола для передачи стольких параметров, сколько возможно, в регистрах. Если доступно достаточное количество регистров чтобы передать все параметры функции, и вызываемая функция не использует локальные переменные, то отпадает необходимость генерации кода для пролога и эпилога функции (они обычно нужны для установки адресации фрейма стека). Компилятор WATCOM C 6.0 использует этот подход (см. рис. 5). Существенное приращение скорости получается потому, что не только удаляются инструкции, но и потому, что параметры уже регистровые и могут обрабатываться более эффективно. -------------------------------- |РИСУНОК 5: Строение заголовка вызова функции | +-------------------------------+ |Исходный текст на Си MICROSOFT WATCOM | |(x)-врем. циклы C 5.0 C 6.0 | +-------------------------------+ |/*Тест вызова funcall funcall | | функции */ push bp push DX | |int funcall() mov BP,SP xor DX,DX | |{ sub SP,2 L4 mov AX,DX "- | | int i; push SI call dummy | | | sub SI,SI inc DX (23)| | for(i=0;i"20000;i++) $L20008: cmp DX,2000 | | | { dummy(i); } ; push SI "- jl L4 "- | |} call dummy | pop DX | |
|
|