Функция или процедура

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Функция или процедура

Сообщение Zver »

Уважаемые форумчане, хочу повысить свою грамотность.

Одного и того результата можно добиться процедурой или функцией с типом void.
Равнозначны ли эти два варианта в Vip, и если нет, то что правильнее использовать и почему.
Программист-самоучка
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Функция или процедура

Сообщение edward_K »

не помню void в випе. Не извращайтесь и пользуйтесь то, чем положено - не надо возвращать значение - процедура, надо - функция.
Лучше если нужно передавать часто строки, то сделайте тип переменных var string или хотя бы const .. string. Можете объекты или record передавать - они наверное тоже пойдут по ссылке.
Ядро вообще то паскалевское(или дельфи - кому что понятней), но вот деталей работы компилятора - во что он там преобразует, не знаю.
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: Функция или процедура

Сообщение Zver »

Мне интересен этот вопрос с точки зрения производительности.

Является ли одна из этих конструкций устаревшей, или же они полностью равнозначны?
Программист-самоучка
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Функция или процедура

Сообщение edward_K »

Еще раз. Функций с void не видел. Тип сам по себе существует - эт да, но функций возвращающих void нету. Variant есть, void нет.
Насчет быстродействия - сделайте 100000 запуск процедуры и функции(параметры несколько строк) - результат сообщите. Думаю разница будет настолько мала, что можно будет списать на погрешность. А вот передача значений по ссылке может существенно ускорить процесс, да и кэшировать же можно.
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: Функция или процедура

Сообщение Zver »

Итак, вот код теста:

Код: Выделить всё

interface Test_Proc_Func;

const
  ITER_NUMBER : longInt  = 10000000;
end;

var
  i : longInt;
  S_TMP1 : string;
  S_TMP2 : string;
  S_TMP3 : string;
  S_TMP4 : string;

function TestVoidFunc_NoVar(s1, s2, s3, s4: string): void;
var
  sTemp: string;
{
  sTemp := s1 + s2 + s3 + s4;
}

function TestVoidFunc_Var(var s1: string; var s2: string; var s3: string; var s4: string): void;
var
  sTemp: string;
{
  sTemp := s1 + s2 + s3 + s4;
}

procedure TestProcedure_NoVar(s1, s2, s3, s4: string);
var
  sTemp: string;
{
  sTemp := s1 + s2 + s3 + s4;
}

procedure TestProcedure_Var(var s1: string; var s2: string; var s3: string; var s4: string);
var
  sTemp: string;
{
  sTemp := s1 + s2 + s3 + s4;
}

HandleEvent
  cmInit:
  {
    S_TMP1 := 'Temp1';
    S_TMP2 := 'Temp2';
    S_TMP3 := 'Temp3';
    S_TMP4 := 'Temp4';

    OpenMessageLog('D:\Test_func.txt', mfLog2Stream + mfBatch );
    Message('Start');

    for( i := 0; i < ITER_NUMBER; ++i)
      TestVoidFunc_NoVar(S_TMP1, S_TMP2, S_TMP3, S_TMP4);

    Message('Функция, по значению');

    for( i := 0; i < ITER_NUMBER; ++i)
       TestVoidFunc_Var(S_TMP1, S_TMP2, S_TMP3, S_TMP4);

    Message('Функция, по ссылке');

    for( i := 0; i < ITER_NUMBER; ++i)
       TestProcedure_NoVar(S_TMP1, S_TMP2, S_TMP3, S_TMP4);

    Message('Процедура, по значению');

    for( i := 0; i < ITER_NUMBER; ++i)
       TestProcedure_Var(S_TMP1, S_TMP2, S_TMP3, S_TMP4);

    Message('Процедура, по ссылке');

    CloseMessageLog();

    Message('Тестирование завершено');
  }
end;
end.
Вот сформированный лог:
17:33:15 │ Start
17:34:03 │ Функция, по значению
17:34:54 │ Функция, по ссылке
17:35:42 │ Процедура, по значению
17:36:35 │ Процедура, по ссылке

Итого: 50 +/- 3 сек. Разброс не более 6%.

Вопросов больше нет :)
Программист-самоучка
LaaLaa

Re: Функция или процедура

Сообщение LaaLaa »

Язык VIP это не С++ и не Pascal. Результат компиляции это не бинарный код и не машинные команды, а разветвленные коллекции различных объектов (список параметров это коллекция, каждый параметр это объект-потомок от базового типа поле, функции и процедуры это тоже коллекции операторов каждый оператор это потомок от некого базового объекта оператора и т.п.).

Разницы по времени выполнения при передаче параметров по ссылке или по значению не будет практически никакой. Разница только семантическая (смысловая, входной-выходной параметр).
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Функция или процедура

Сообщение edward_K »

Ну если не влом, сделайте еще следующее
текст переменных увеличьте до 128 байт, число переменных увеличьте до 8.
строки sTemp := s1 + s2 + s3 + s4; закоменьте. я LaaLaa верю, но когда то это влияло.
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: Функция или процедура

Сообщение Zver »

Итак, результат нового теста:

09:31:25 │ Start
09:32:01 │ Функция, по значению (36 сек)
09:32:40 │ Функция, по ссылке (39 сек)
09:33:16 │ Процедура, по значению (36 сек)
09:33:54 │ Процедура, по ссылке (38 сек)

Итого: 36 +/- 2 сек (те же 6%)

Вот код нового теста:

Код: Выделить всё

interface Test_Proc_Func;

const
  ITER_NUMBER : longInt  = 10000000;
end;

var
  i : longInt;
  S_TMP1 : string;
  S_TMP2 : string;
  S_TMP3 : string;
  S_TMP4 : string;

function TestVoidFunc_NoVar(s1, s2, s3, s4: string): void;
{}

function TestVoidFunc_Var(var s1: string; var s2: string; var s3: string; var s4: string): void;
{}

procedure TestProcedure_NoVar(s1, s2, s3, s4: string);
{}

procedure TestProcedure_Var(var s1: string; var s2: string; var s3: string; var s4: string);
{}

HandleEvent
  cmInit:
  {
    S_TMP1 := 'Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1';
    S_TMP2 := 'Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1';
    S_TMP3 := 'Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1';
    S_TMP4 := 'Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1Temp1';

    OpenMessageLog('D:\Test_func.txt', mfLog2Stream + mfBatch );
    Message('Start');

    for( i := 0; i < ITER_NUMBER; ++i)
      TestVoidFunc_NoVar(S_TMP1, S_TMP2, S_TMP3, S_TMP4);

    Message('Функция, по значению');

    for( i := 0; i < ITER_NUMBER; ++i)
       TestVoidFunc_Var(S_TMP1, S_TMP2, S_TMP3, S_TMP4);

    Message('Функция, по ссылке');

    for( i := 0; i < ITER_NUMBER; ++i)
       TestProcedure_NoVar(S_TMP1, S_TMP2, S_TMP3, S_TMP4);

    Message('Процедура, по значению');

    for( i := 0; i < ITER_NUMBER; ++i)
       TestProcedure_Var(S_TMP1, S_TMP2, S_TMP3, S_TMP4);

    Message('Процедура, по ссылке');

    CloseMessageLog();

    Message('Тестирование завершено');
  }

end;
end.
Программист-самоучка
oiko
Местный житель
Сообщения: 418
Зарегистрирован: 29 мар 2005, 17:49

Re: Функция или процедура

Сообщение oiko »

Когда начинал писать на випе под версию Галактики 5,5 попытался использовать void - функцию, компилятор сьел но обозвал меня подлым сионистом.
Ответить