Страница 1 из 1
Функция или процедура
Добавлено: 17 дек 2013, 11:22
Zver
Уважаемые форумчане, хочу повысить свою грамотность.
Одного и того результата можно добиться процедурой или функцией с типом void.
Равнозначны ли эти два варианта в Vip, и если нет, то что правильнее использовать и почему.
Re: Функция или процедура
Добавлено: 17 дек 2013, 11:59
edward_K
не помню void в випе. Не извращайтесь и пользуйтесь то, чем положено - не надо возвращать значение - процедура, надо - функция.
Лучше если нужно передавать часто строки, то сделайте тип переменных var string или хотя бы const .. string. Можете объекты или record передавать - они наверное тоже пойдут по ссылке.
Ядро вообще то паскалевское(или дельфи - кому что понятней), но вот деталей работы компилятора - во что он там преобразует, не знаю.
Re: Функция или процедура
Добавлено: 17 дек 2013, 17:34
Zver
Мне интересен этот вопрос с точки зрения производительности.
Является ли одна из этих конструкций устаревшей, или же они полностью равнозначны?
Re: Функция или процедура
Добавлено: 17 дек 2013, 18:01
edward_K
Еще раз. Функций с void не видел. Тип сам по себе существует - эт да, но функций возвращающих void нету. Variant есть, void нет.
Насчет быстродействия - сделайте 100000 запуск процедуры и функции(параметры несколько строк) - результат сообщите. Думаю разница будет настолько мала, что можно будет списать на погрешность. А вот передача значений по ссылке может существенно ускорить процесс, да и кэшировать же можно.
Re: Функция или процедура
Добавлено: 17 дек 2013, 19:41
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%.
Вопросов больше нет
Re: Функция или процедура
Добавлено: 18 дек 2013, 01:06
LaaLaa
Язык VIP это не С++ и не Pascal. Результат компиляции это не бинарный код и не машинные команды, а разветвленные коллекции различных объектов (список параметров это коллекция, каждый параметр это объект-потомок от базового типа поле, функции и процедуры это тоже коллекции операторов каждый оператор это потомок от некого базового объекта оператора и т.п.).
Разницы по времени выполнения при передаче параметров по ссылке или по значению не будет практически никакой. Разница только семантическая (смысловая, входной-выходной параметр).
Re: Функция или процедура
Добавлено: 18 дек 2013, 11:17
edward_K
Ну если не влом, сделайте еще следующее
текст переменных увеличьте до 128 байт, число переменных увеличьте до 8.
строки sTemp := s1 + s2 + s3 + s4; закоменьте. я LaaLaa верю, но когда то это влияло.
Re: Функция или процедура
Добавлено: 18 дек 2013, 11:37
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.
Re: Функция или процедура
Добавлено: 18 дек 2013, 13:04
oiko
Когда начинал писать на випе под версию Галактики 5,5 попытался использовать void - функцию, компилятор сьел но обозвал меня подлым сионистом.