Почему Sysutils.RenameFile встроен?

[dcc32 Hint] H2443 Встроенная функция 'RenameFile' не была расширена потому что единица "Winapi.Windows" не указана в списке USES

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

Но как может встраивать функцию ввода-вывода, может улучшить скорость? Я имею в виду, если вы нажмете RenameFile, вы получите несколько микросекунд. Но выполнение самой функции может занять миллисекунды, может быть, даже десятки мс, если диск занят.

Более того, если вы используете RenameFile, вы, вероятно, находитесь в блоке кода, где выполняете другие операции ввода-вывода. Таким образом, этот блок кода займет много времени. Таким образом, сейчас выигрыш становится еще более незначительным.

Ответ 1

RenameFile является встроенным, потому что это простой вызов другой функции.

Вот как это выглядит:

function RenameFile(const OldName, NewName: string): Boolean;
{$IFDEF MSWINDOWS}
begin
  Result := MoveFile(PChar(OldName), PChar(NewName));
end;

Встраивая эту функцию, вызов SysUtils.RenameFile заменяется вызовом WinApi.Windows.MoveFile.

Это имеет следующие преимущества:

  • Вы сохраняете вызов, вместо двух вызовов вы имеете только один вызов.
  • Ваш кодовый код имеет точно такой же размер.
  • ЦП хранит список обратных адресов для предсказания ветвлений (буфер буфера возврата); устраняя избыточный вызов, он экономит место в этом буфере, это предотвращает неправильное предсказание, если стек вызовов становится слишком глубоким.
  • Сгенерированный код меньше, потому что сам RenameFile устраняется.

Таким образом, вставка очень важна, особенно в рекурсивном коде, где стек вызовов может получить глубокий процессор, который начнет неверно прогнозировать возврат, потому что переполнение буфера возврата (у некоторых процессоров есть только 8 записей, верхняя часть линии CPU имеют 24 записи).

Как правило, каждая подпрограмма, которая просто вызывает другую процедуру, всегда должна быть встроена.

Правильно спрогнозированная стоимость возврата стоит один цикл, неверный прогноз опустошает трубопровод и стоит 25 циклов или более; добавляются дополнительные задержки, потому что обратный адрес нужно извлекать из памяти, а не из буфера.

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