pascal Время выполнения кода программы, как его измерить в Паскале

Примечение: ниже речь будет идти о возможностях 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. 

Ссылки по теме:

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

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.// Завершение программы

_____________
матфак вгу и остальная классика =)

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's picture

*-+*+ ==> -++##
--+*+
--+++

2*2-5+5*6+7

_____________
матфак вгу и остальная классика =)