Накладные расходы на вызов функции


#1

На лекции было задание проверить, насколько велики накладные расходы на вызов коротких функций. Жду примеры программ и анализ здесь


#2

Доброго времени суток. Проверил. С функцией сложения. Оказалось примерно в 2 раза медленнее. Ожидал, что в 5 - 8) Вот код:

function add(a, b : integer) : integer;
begin
  result := a + b;
end;

begin
  var a := 10;
  var b := 10;
  var c : integer;
  MillisecondsDelta;
  for var i := 1 to integer.MaxValue do
    c := a + b;
  writeln(MillisecondsDelta);
  for var i := 1 to integer.MaxValue do
    c := add(a, b);
  writeln(MillisecondsDelta);
end.

Выводил примерно 4800 для нормального сложения и 9500 для функции.


#3

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


#4

В PascalABC.NET по умолчанию все запускается в debug-режиме и поэтому методы не инлайнятся


#5

Думаю, имелось ввиду, что a+b в первом случае не будет в цикле считаться.


#6

@Ulysses именно.


#7

Для умножения проверил, в среднем почти в 2 раза медленнее, но с увеличением количества операций разница становится ощутимо меньше.

function prod(a, b: integer): integer;
begin
  result := a * b;
 end;

 begin
  var c: integer;
  MillisecondsDelta;
  for var i := 1 to 100000 do
    for var j := 1 to 100000 do
      c := i * j;
  writeln(MillisecondsDelta);
  for var i := 1 to 100000 do
    for var j := 1 to 100000 do
      c := prod(i, j);
  writeln(MillisecondsDelta);
end.

Вот такой результат: 30334 57608


#8