Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Разница в производительности function и procedure

#delphi #pascal


Чем отличается
function some(i:integer):integer;
 begin
   some:=i;
 end;

от
procedure some(i:integer;var j:integer);
 begin
   j:=i;
 end;

Предположительно, ничем.
Может, кто-то уже делал тесты, или просто знает?    


Ответы

Ответ 1



_FSOME$$INTEGER: push ebp mov ebp, esp sub esp, 4 mov eax, dword [ebp + 8] mov dword [ebp - 4], eax L1: mov eax, dword [ebp - 4] mov esp, ebp pop ebp ret 4 _PSOME$$INTEGER$INTEGER: push ebp mov ebp, esp mov eax, dword [ebp + 12] mov edx, dword [ebp + 8] mov dword [eax], edx L2: mov esp, ebp pop ebp ret 8 _main: mov dword [_A], 5 push dword [_A] call _FSOME$$INTEGER mov dword [_B], eax push offset [_B] push dword [_A] call _PSOME$$INTEGER$INTEGER call exit Если посчитаете количество команд то увидите что при использовании функции выполняется на 2 команды больше, чем в процедурном варианте. Уверен что на других компиляторах, с различными настройками оптимизации можно увидеть совсем другой результат. А по делу используйте функции когда вам надо вернуть одно значение, а вариант с процедурой когда нужно вернуть несколько значений.

Ответ 2



Разница запросто может быть. Вообще, всё зависит от компилятора. В общем случае первый вариант должен работать быстрее на основных процессорах, так как число на выходе из функции передаётся через регистр в виде значения. Во втором случае, вы имеете указатель на место в памяти, куда надо записать результат. В втором случае у вас чтение параметра из стека (указатель j) и запись по этому адресу значения. В первом случае значение кладётся в eax/rax и функция заканчивается. Однако, есть вероятность, что компилятор "просечёт" ситуацию и во втором случае тоже попытается схитрить. Но это не обязательно произойдёт. К тому же, в общем случае это не всегда возможно.

Ответ 3



Если посчитаете количество команд то увидите что при использовании функции выполняется на 2 команды больше, чем в процедурном варианте. Одинаковые инструкции в разной последовательности исполняются за разное время. Уже давно процессоры используют очереди команд(конвеер), предсказание ветвлений и пр. На этой конструкции: mov eax, dword [ebp + 8] mov dword [ebp - 4], eax Процессор будет простаивать. Вобщем отвратительный генерируемый код.

Комментариев нет:

Отправить комментарий