pascal Время выполнения кода программы, как его измерить в Паскале
Primary tabs
Примечение: ниже речь будет идти о возможностях Free Pascal (доступен в IDE Lazarus Delphi)
Общая идея (замер идет в миллисекундах):
uses DateUtils, sysutils;
var
FromTime, ToTime: TDateTime;
MilliSecondsDiff: Integer;
begin
FromTime := Now();
{ какой-то ваш код,
время выполнения которого необходимо замерить}
ToTime := Now();
MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime);
writeln('Vremya: ', MilliSecondsDiff);
readln();
end.
С пояснением и примером:
uses DateUtils, sysutils; // подключаем модули для работы со временем
var
// Переменные для "замера" времени:
// пара переменных типа "дата+время"
FromTime, ToTime: TDateTime;
// для хранения разницы
MilliSecondsDiff: Integer;
// Остальные переменные вашей программы:
i: integer;
s: string;
begin
FromTime := Now(); // первая отметка времени
for i := 1 to 10 do
begin
s:='Privet ' + 'Mir!';
Sleep(50); // задерживаем на 50 миллисекунд
end;
ToTime := Now(); // вторая отметка времени
// вычисляем разницу между двумя отметками:
MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime);
writeln('Vremya: ', MilliSecondsDiff);
readln();
end.
Ссылки по теме:
- Функция для получения разницы времени в других единицах измерения (минуты, секунды и т.д.): https://www.freepascal.org/docs-html/cur...
- Источник идеи: https://stackoverflow.com/questions/3288...
- Log in to post comments
- 7358 reads
vedro-compota
Sat, 08/15/2020 - 21:19
Permalink
Пример замера времени
Program LessonPascal; uses DateUtils, sysutils; type IntArr = array[1..30000] of integer; ArrStr = array[1..29999] of string; function GetRandExpr(int: integer): string; var i, max, val: integer; some_str, conv, tmp: string; ArraySign: array[1..3] of string = ('+', '-', '*'); begin randomize(); max := 100; val := 0; some_str := ''; tmp := ''; for i := 1 to int do begin if(i mod 2 = 0) then some_str += ArraySign[random(3) + 1] else begin val := random(max) + 1; str(val, conv); some_str += conv; end; if(int mod 2 = 0) and (i = int - 1) then break; end; result := some_str; end; function Check_tmp(s: string; var mas: IntArr; var posArr: integer): IntArr; var a, i: integer; begin if(s <> '')then begin val(s, a); mas[posArr] := a; end; result := mas; end; procedure parsingString(str: string; var otherArr: IntArr; var otherSig: ArrStr); var tmp: string; key: boolean; i, j, k, conv: integer; begin k := 1; for i := 1 to length(str) do begin key := false; if(str[i] >= '0') and (str[i] <= '9') then tmp += str[i] else if(str[i] = '+') or (str[i] = '-') or (str[i] = '*') then begin otherSig[k] := str[i]; k += 1; key := true; end; if(key = true) and (tmp <> '') then begin val(tmp, conv); j += 1; otherArr[j] := conv; tmp := ''; end; end; j += 1; Check_tmp(tmp, otherArr, j); end; function RebuildArrSig(copy_arr_sig: ArrStr): ArrStr; var i, j: integer; newarrSig: ArrStr; begin j := 1; i := 1; while(i < length(copy_arr_sig)) do begin if(copy_arr_sig[i] = '') then i += 1; newarrSig[j] := copy_arr_sig[i]; j += 1; i += 1; end; result := newarrSig; end; function RebuildIntArr(copy_arr_int: IntArr): IntArr; var i, j: integer; new_int_arr: IntArr; begin j := 1; i := 1; while(i < length(copy_arr_int)) do begin if(copy_arr_int[i] = -1) then i += 1; new_int_arr[j] := copy_arr_int[i]; j += 1; i += 1; end; result := new_int_arr; end; function GetRes(arrInt: IntArr; arrStr: ArrStr): integer; var i, x: integer; begin x := arrInt[1]; for i := 1 to length(arrStr) do begin if(arrStr[i] = '+') then x := x + arrInt[i + 1] else if(arrStr[i] = '-') then x := x - arrInt[i + 1]; end; result := x; end; procedure multOperation(var otherArr: IntArr; var otherSig: ArrStr); var i: integer; begin for i := 1 to length(otherSig) do begin if(otherSig[i] = '') then break; if(otherSig[i] = '*') then begin otherSig[i] := ''; if(otherArr[i] = -1) then begin otherArr[i] := otherArr[i - 1] * otherArr[i + 1]; otherArr[i - 1] := -1; end else begin otherArr[i] := otherArr[i] * otherArr[i + 1]; otherArr[i + 1] := -1; end; end; end; end; function CompRandExp(some_str: string): integer; var arr: IntArr; arrSig: ArrStr; begin parsingString(some_str, arr, arrSig); multOperation(arr, arrSig); arrSig := RebuildArrSig(arrSig); arr := RebuildIntArr(arr); result := GetRes(arr, arrSig); end; procedure get_print_arr( s: string; var int_arr : ArrStr ); var i, k, n, l,f,count,lab,value_arr1,value_arr2,sign_mult,code,fix_sign,fix_int,mult_sign: integer; symbol, acc_str, str_value: string; sign_arr : ArrStr; begin // начало тела процедуры i := 1; k := 1; n := 1; l := 1; // начальный индекс массива count := 0; // счетчик цикла lab := 0; f := 0; // кол-во сдвигов массивов для уменьшения обхода в цикле sign_mult := 0; fix_sign := 0; fix_int := 0; mult_sign := 0; while( i <= length( s ) ) do // пока истинно условие выполняем begin acc_str := ' ' ; // пустая строка symbol := s[i]; // первый символ строки while( symbol >= '0' ) and ( symbol <= '9' ) do begin acc_str += symbol; // прибавляем в переменную элемент строки i += 1; if( i <= length( s ) ) then // если не вышли за длинну строки symbol := s[i] // символ равен символу строки с индексом i else break; // иначе завершаем end; if( symbol = '+' ) or ( symbol = '-' ) or ( symbol = '*' ) then begin sign_arr[n] := symbol; // первый массив n += 1; // увеличиваем индекс fix_sign += 1; // считаем кол-во знаков if( symbol = '*' ) then mult_sign += 1; end; if ( acc_str <> ' ' ) then // если строка не пуста begin int_arr[k] := acc_str; // второй массив k += 1; // увеличиваем индекс массива fix_int += 1; // считаем кол-во чисел end; i += 1; end; //writeln( int_arr[1], int_arr[2] ); while( count < fix_sign ) do begin if( sign_arr[l] = '*' ) then begin val( int_arr[l], value_arr1, code ); val( int_arr[l + 1], value_arr2, code ); value_arr1 := value_arr1 * value_arr2; str( value_arr1, str_value ); int_arr[l] := str_value; for i := l + 1 to ( fix_int - 1 - f ) do int_arr[i] := int_arr[i+1]; int_arr[fix_int - f] := ''; for i := l to ( fix_sign - 1 - f ) do sign_arr[i] := sign_arr[i+1]; sign_arr[fix_sign - f ] := ''; sign_mult += 1; f += 1; lab += 1; count += 1; end else begin if( sign_arr[l] = '+' ) and ( sign_mult = mult_sign ) then begin val( int_arr[l], value_arr1, code ); val( int_arr[l + 1], value_arr2, code ); value_arr1 := value_arr1 + value_arr2; str( value_arr1, str_value ); int_arr[l] := str_value; for i := l + 1 to ( fix_int - 1 - f ) do int_arr[i] := int_arr[i+1]; int_arr[fix_int - f] := ''; for i := l to ( fix_sign - 1 - f ) do sign_arr[i] := sign_arr[i+1]; sign_arr[fix_sign - f ] := ''; f += 1; lab += 1; count += 1; end else if( sign_arr[l] = '-' ) and ( sign_mult = mult_sign ) then begin val( int_arr[l], value_arr1, code ); val( int_arr[l + 1], value_arr2, code ); value_arr1 := value_arr1 - value_arr2; str( value_arr1, str_value ); int_arr[l] := str_value; for i := l + 1 to ( fix_int - 1 - f ) do int_arr[i] := int_arr[i+1]; int_arr[fix_int - f] := ''; for i := l to ( fix_sign - 1 - f ) do sign_arr[i] := sign_arr[i+1]; sign_arr[fix_sign - f ] := ''; f += 1; lab += 1; count += 1; end; end; if( lab = 1 ) then begin l := 1; lab := 0; end else l += 1; end; end; // завершение тела процедуры var numb, MilliSecondsDiff: integer; str: string; FromTime, ToTime: TDateTime; i, iterCount: integer; int_arr : ArrStr; begin str := GetRandExpr(29000); //writeln(str); str := '5+92-15+75*53+76-21+5+92-15+75*53+76-21+5+92-15+75*53+76-21-15+75*53+76-15+75*53+76-15+75*53+76-15+75*53+76'; FromTime := Now(); iterCount := 100; // число комбинаций for i:=1 to iterCount do numb := CompRandExp(str); writeln(); writeln('Result = ', numb); ToTime := Now(); MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime); writeln('Vremya1: ', MilliSecondsDiff); FromTime := Now(); for i:=1 to iterCount do get_print_arr(str, int_arr); writeln( 'Result 2: ', int_arr[1]); ToTime := Now(); MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime); writeln('Vremya2: ', MilliSecondsDiff); readln(); // Удержание консоль end.// Завершение программы_____________
матфак вгу и остальная классика =)
JimATI
Wed, 09/09/2020 - 13:06
Permalink
Дополнение с результатом третьего участника
Program LessonPascal; uses DateUtils, sysutils; type IntArr = array[1..30000] of integer; ArrStr = array[1..29999] of string; var l:IntArr; t:ArrStr; function GetRandExpr(int: integer): string; var i, max, val: integer; some_str, conv, tmp: string; ArraySign: array[1..3] of string = ('+', '-', '*'); begin randomize(); max := 100; val := 0; some_str := ''; tmp := ''; for i := 1 to int do begin if(i mod 2 = 0) then some_str += ArraySign[random(3) + 1] else begin val := random(max) + 1; str(val, conv); some_str += conv; end; if(int mod 2 = 0) and (i = int - 1) then break; end; result := some_str; end; function Check_tmp(s: string; var mas: IntArr; var posArr: integer): IntArr; var a, i: integer; begin if(s <> '')then begin val(s, a); mas[posArr] := a; end; result := mas; end; procedure parsingString(str: string; var otherArr: IntArr; var otherSig: ArrStr); var tmp: string; key: boolean; i, j, k, conv: integer; begin k := 1; for i := 1 to length(str) do begin key := false; if(str[i] >= '0') and (str[i] <= '9') then tmp += str[i] else if(str[i] = '+') or (str[i] = '-') or (str[i] = '*') then begin otherSig[k] := str[i]; k += 1; key := true; end; if(key = true) and (tmp <> '') then begin val(tmp, conv); j += 1; otherArr[j] := conv; tmp := ''; end; end; j += 1; Check_tmp(tmp, otherArr, j); end; function RebuildArrSig(copy_arr_sig: ArrStr): ArrStr; var i, j: integer; newarrSig: ArrStr; begin j := 1; i := 1; while(i < length(copy_arr_sig)) do begin if(copy_arr_sig[i] = '') then i += 1; newarrSig[j] := copy_arr_sig[i]; j += 1; i += 1; end; result := newarrSig; end; function RebuildIntArr(copy_arr_int: IntArr): IntArr; var i, j: integer; new_int_arr: IntArr; begin j := 1; i := 1; while(i < length(copy_arr_int)) do begin if(copy_arr_int[i] = -1) then i += 1; new_int_arr[j] := copy_arr_int[i]; j += 1; i += 1; end; result := new_int_arr; end; function GetRes(arrInt: IntArr; arrStr: ArrStr): integer; var i, x: integer; begin x := arrInt[1]; for i := 1 to length(arrStr) do begin if(arrStr[i] = '+') then x := x + arrInt[i + 1] else if(arrStr[i] = '-') then x := x - arrInt[i + 1]; end; result := x; end; procedure multOperation(var otherArr: IntArr; var otherSig: ArrStr); var i: integer; begin for i := 1 to length(otherSig) do begin if(otherSig[i] = '') then break; if(otherSig[i] = '*') then begin otherSig[i] := ''; if(otherArr[i] = -1) then begin otherArr[i] := otherArr[i - 1] * otherArr[i + 1]; otherArr[i - 1] := -1; end else begin otherArr[i] := otherArr[i] * otherArr[i + 1]; otherArr[i + 1] := -1; end; end; end; end; function CompRandExp(some_str: string): integer; var arr: IntArr; arrSig: ArrStr; begin parsingString(some_str, arr, arrSig); multOperation(arr, arrSig); arrSig := RebuildArrSig(arrSig); arr := RebuildIntArr(arr); result := GetRes(arr, arrSig); end; //****************************************************************************** procedure get_print_arr( s: string; var int_arr : ArrStr ); var i, k, n, l,f,count,lab,value_arr1,value_arr2,sign_mult,code,fix_sign,fix_int,mult_sign: integer; symbol, acc_str, str_value: string; sign_arr : ArrStr; begin // начало тела процедуры i := 1; k := 1; n := 1; l := 1; // начальный индекс массива count := 0; // счетчик цикла lab := 0; f := 0; // кол-во сдвигов массивов для уменьшения обхода в цикле sign_mult := 0; fix_sign := 0; fix_int := 0; mult_sign := 0; while( i <= length( s ) ) do // пока истинно условие выполняем begin acc_str := ' ' ; // пустая строка symbol := s[i]; // первый символ строки while( symbol >= '0' ) and ( symbol <= '9' ) do begin acc_str += symbol; // прибавляем в переменную элемент строки i += 1; if( i <= length( s ) ) then // если не вышли за длинну строки symbol := s[i] // символ равен символу строки с индексом i else break; // иначе завершаем end; if( symbol = '+' ) or ( symbol = '-' ) or ( symbol = '*' ) then begin sign_arr[n] := symbol; // первый массив n += 1; // увеличиваем индекс fix_sign += 1; // считаем кол-во знаков if( symbol = '*' ) then mult_sign += 1; end; if ( acc_str <> ' ' ) then // если строка не пуста begin int_arr[k] := acc_str; // второй массив k += 1; // увеличиваем индекс массива fix_int += 1; // считаем кол-во чисел end; i += 1; end; //writeln( int_arr[1], int_arr[2] ); while( count < fix_sign ) do begin if( sign_arr[l] = '*' ) then begin val( int_arr[l], value_arr1, code ); val( int_arr[l + 1], value_arr2, code ); value_arr1 := value_arr1 * value_arr2; str( value_arr1, str_value ); int_arr[l] := str_value; for i := l + 1 to ( fix_int - 1 - f ) do int_arr[i] := int_arr[i+1]; int_arr[fix_int - f] := ''; for i := l to ( fix_sign - 1 - f ) do sign_arr[i] := sign_arr[i+1]; sign_arr[fix_sign - f ] := ''; sign_mult += 1; f += 1; lab += 1; count += 1; end else begin if( sign_arr[l] = '+' ) and ( sign_mult = mult_sign ) then begin val( int_arr[l], value_arr1, code ); val( int_arr[l + 1], value_arr2, code ); value_arr1 := value_arr1 + value_arr2; str( value_arr1, str_value ); int_arr[l] := str_value; for i := l + 1 to ( fix_int - 1 - f ) do int_arr[i] := int_arr[i+1]; int_arr[fix_int - f] := ''; for i := l to ( fix_sign - 1 - f ) do sign_arr[i] := sign_arr[i+1]; sign_arr[fix_sign - f ] := ''; f += 1; lab += 1; count += 1; end else if( sign_arr[l] = '-' ) and ( sign_mult = mult_sign ) then begin val( int_arr[l], value_arr1, code ); val( int_arr[l + 1], value_arr2, code ); value_arr1 := value_arr1 - value_arr2; str( value_arr1, str_value ); int_arr[l] := str_value; for i := l + 1 to ( fix_int - 1 - f ) do int_arr[i] := int_arr[i+1]; int_arr[fix_int - f] := ''; for i := l to ( fix_sign - 1 - f ) do sign_arr[i] := sign_arr[i+1]; sign_arr[fix_sign - f ] := ''; f += 1; lab += 1; count += 1; end; end; if( lab = 1 ) then begin l := 1; lab := 0; end else l += 1; end; end; // завершение тела процедуры //****************************************************************************** function Sieve(s:string):integer;// процедура распределения чисел и знаков в массивы из string var p,c,d,f,i,n,h,m:integer; //счетчик массива знаков w:string; begin d:=1; c:=1; p:=1; for i:= 1 to length(s) do begin if (s[i]>='0')and(s[i]<='9') then // выделяем цифры в массив begin w:=w+s[i]; val(w,f); // функция val преобразует и сразу записывает в масив integer l[d]:=f; c:=p; end else if (s[i]<>' ') then begin t[c]:=s[i]; d:=d+1; w:=''; inc(p); // счетчик массива знаков end; end; m:=d; // m количество чисел в массиве c:=0; while (c<(m)) do // цикл для поиска умножения begin c:=c+1; if (t[c]='*') then // если нашли умножение begin d:=c; h:=c; l[d]:=l[d]*l[d+1]; //умножаем текущее число с следующим for d:= (c+1) to m do //сдвиг в масииве чисел begin l[d]:=l[d+1]; end; for c:= h to (m-1) do //сдвиг в масиве знаков begin t[c]:=t[c+1]; end; c:=1; end; end; d:=1; c:=1; if (t[c]='+') then //находим первую сумму/разность begin n:=l[d]+l[d+1]; d:=d+1; c:=c+1 end else begin n:=l[d]-l[d+1]; d:=d+1; c:=c+1; end; while (d<m) do //продолжение следующих операций с предыдущей суммой и цифрами begin if (t[c]='+') then //если не сумма, значит разность begin n:=n+l[d+1]; c:=c+1; d:=d+1; end else begin n:=n-l[d+1]; c:=c+1; d:=d+1; end; end; result:=n; end; var numb, MilliSecondsDiff,numb2: integer; str: string; FromTime, ToTime: TDateTime; i, iterCount: integer; int_arr : ArrStr; begin str := GetRandExpr(29000); //writeln(str); str := '5+92-15+75*53+76-21+5+92-15+75*53+76-21+5+92-15+75*53+76-21-15+75*53+76-15+75*53+76-15+75*53+76-15+75*53+76'; FromTime := Now(); iterCount := 100; // число комбинаций for i:=1 to iterCount do numb := CompRandExp(str); writeln(); writeln('Result 1= ', numb); ToTime := Now(); MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime); writeln('Vremya F: ', MilliSecondsDiff); FromTime := Now(); for i:=1 to iterCount do get_print_arr(str, int_arr); writeln( 'Result 2: ', int_arr[1]); ToTime := Now(); MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime); writeln('Vremya S: ', MilliSecondsDiff); FromTime := Now(); for i:=1 to iterCount do numb2:=Sieve(str); writeln( 'Result 3: ',numb2); ToTime := Now(); MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime); writeln('Vremya J: ', MilliSecondsDiff); readln(); // Удержание консоль end.// Завершение программыvedro-compota
Wed, 09/09/2020 - 19:42
Permalink
*-+*+ ==> -++##
2*2-5+5*6+7
_____________
матфак вгу и остальная классика =)