Есть ли перегрузка функций в Delphi? - PullRequest
6 голосов
/ 28 сентября 2010

Есть ли какие-либо дополнительные издержки времени выполнения при вызове перегруженных функций?

(я спрашиваю это специально для Delphi, если ответ не одинаков для всех компилируемых языков)

Я думаюне так, как это должно быть решено во время компиляции, но вы никогда не можете быть уверены, не так ли?

Ответы [ 2 ]

19 голосов
/ 28 сентября 2010

Конечно, вы можете быть уверены, потому что это задокументировано .Это компилятор, который разрешает его во время компиляции, поэтому нет дополнительных затрат при вызове перегруженных функций в Delphi.

[Редактировать]

Я сделал для вас небольшой тест:

var
  j: Integer;
  st: string;

procedure DoNothing(i: Integer); overload;
begin
  j := i;
end;

procedure DoNothing(s: string); overload;
begin
  st := s;
end;

procedure DoNothingI(i: integer);
begin
  j := i;
end;

procedure TForm2.Button1Click(Sender: TObject);
const
  MaxIterations = 10000000;
var
  StartTick, EndTick: Cardinal;
  I: Integer;
begin
  StartTick := GetTickCount;
  for I := 0 to MaxIterations - 1 do
    DoNothing(I);
  EndTick := GetTickCount;
  Label1.Caption := Format('Overlaod ellapsed ticks: %d [j:%d]', [EndTick - StartTick, j]);
  StartTick := GetTickCount;
  for I := 0 to MaxIterations - 1 do
    DoNothingI(I);
  EndTick := GetTickCount;
  Label1.Caption := Format('%s'#13'Normal ellapsed ticks: %d [j:%d]', [Label1.Caption, EndTick - StartTick, j]);
end;

Результат: Почти все время 31 тик (миллисекунда) для обоих на моем компьютере разработчика, иногда перегрузка занимает всего 16 тиков.

alt text

3 голосов
/ 29 сентября 2010

Перегрузка разрешается во время компиляции (без накладных расходов), но перегрузка имеет накладные расходы!virtual быстрее, чем dynamic:

http://docwiki.embarcadero.com/RADStudio/en/Methods

Виртуальный или динамический
В Delphi для Win32 виртуальные и динамические методы семантически эквивалентны.
Однако они отличаются реализацией диспетчеризации вызовов методов во время выполнения: виртуальные методы оптимизируют по скорости, а динамические методы оптимизируют по размеру кода.

...