Функция или процедура
Модераторы: m0p3e, edward_K, Модераторы
-
- Местный житель
- Сообщения: 204
- Зарегистрирован: 13 ноя 2012, 12:47
- Откуда: СПб
- Контактная информация:
Функция или процедура
Уважаемые форумчане, хочу повысить свою грамотность.
Одного и того результата можно добиться процедурой или функцией с типом void.
Равнозначны ли эти два варианта в Vip, и если нет, то что правильнее использовать и почему.
Одного и того результата можно добиться процедурой или функцией с типом void.
Равнозначны ли эти два варианта в Vip, и если нет, то что правильнее использовать и почему.
Программист-самоучка
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Функция или процедура
не помню void в випе. Не извращайтесь и пользуйтесь то, чем положено - не надо возвращать значение - процедура, надо - функция.
Лучше если нужно передавать часто строки, то сделайте тип переменных var string или хотя бы const .. string. Можете объекты или record передавать - они наверное тоже пойдут по ссылке.
Ядро вообще то паскалевское(или дельфи - кому что понятней), но вот деталей работы компилятора - во что он там преобразует, не знаю.
Лучше если нужно передавать часто строки, то сделайте тип переменных var string или хотя бы const .. string. Можете объекты или record передавать - они наверное тоже пойдут по ссылке.
Ядро вообще то паскалевское(или дельфи - кому что понятней), но вот деталей работы компилятора - во что он там преобразует, не знаю.
-
- Местный житель
- Сообщения: 204
- Зарегистрирован: 13 ноя 2012, 12:47
- Откуда: СПб
- Контактная информация:
Re: Функция или процедура
Мне интересен этот вопрос с точки зрения производительности.
Является ли одна из этих конструкций устаревшей, или же они полностью равнозначны?
Является ли одна из этих конструкций устаревшей, или же они полностью равнозначны?
Программист-самоучка
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Функция или процедура
Еще раз. Функций с void не видел. Тип сам по себе существует - эт да, но функций возвращающих void нету. Variant есть, void нет.
Насчет быстродействия - сделайте 100000 запуск процедуры и функции(параметры несколько строк) - результат сообщите. Думаю разница будет настолько мала, что можно будет списать на погрешность. А вот передача значений по ссылке может существенно ускорить процесс, да и кэшировать же можно.
Насчет быстродействия - сделайте 100000 запуск процедуры и функции(параметры несколько строк) - результат сообщите. Думаю разница будет настолько мала, что можно будет списать на погрешность. А вот передача значений по ссылке может существенно ускорить процесс, да и кэшировать же можно.
-
- Местный житель
- Сообщения: 204
- Зарегистрирован: 13 ноя 2012, 12:47
- Откуда: СПб
- Контактная информация:
Re: Функция или процедура
Итак, вот код теста:
Вот сформированный лог:
17:33:15 │ Start
17:34:03 │ Функция, по значению
17:34:54 │ Функция, по ссылке
17:35:42 │ Процедура, по значению
17:36:35 │ Процедура, по ссылке
Итого: 50 +/- 3 сек. Разброс не более 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;
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: Функция или процедура
Язык VIP это не С++ и не Pascal. Результат компиляции это не бинарный код и не машинные команды, а разветвленные коллекции различных объектов (список параметров это коллекция, каждый параметр это объект-потомок от базового типа поле, функции и процедуры это тоже коллекции операторов каждый оператор это потомок от некого базового объекта оператора и т.п.).
Разницы по времени выполнения при передаче параметров по ссылке или по значению не будет практически никакой. Разница только семантическая (смысловая, входной-выходной параметр).
Разницы по времени выполнения при передаче параметров по ссылке или по значению не будет практически никакой. Разница только семантическая (смысловая, входной-выходной параметр).
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Функция или процедура
Ну если не влом, сделайте еще следующее
текст переменных увеличьте до 128 байт, число переменных увеличьте до 8.
строки sTemp := s1 + s2 + s3 + s4; закоменьте. я LaaLaa верю, но когда то это влияло.
текст переменных увеличьте до 128 байт, число переменных увеличьте до 8.
строки sTemp := s1 + s2 + s3 + s4; закоменьте. я LaaLaa верю, но когда то это влияло.
-
- Местный житель
- Сообщения: 204
- Зарегистрирован: 13 ноя 2012, 12:47
- Откуда: СПб
- Контактная информация:
Re: Функция или процедура
Итак, результат нового теста:
09:31:25 │ Start
09:32:01 │ Функция, по значению (36 сек)
09:32:40 │ Функция, по ссылке (39 сек)
09:33:16 │ Процедура, по значению (36 сек)
09:33:54 │ Процедура, по ссылке (38 сек)
Итого: 36 +/- 2 сек (те же 6%)
Вот код нового теста:
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: Функция или процедура
Когда начинал писать на випе под версию Галактики 5,5 попытался использовать void - функцию, компилятор сьел но обозвал меня подлым сионистом.