Эффективность сравнения

ganterrr

вот у меня 2 метода решения линейных уравнения гаусса и простой итерации нужно сравнить быстродействие использовал функцию gettickcount пишет всё время 0 или 15 милисекунд где ошибка вот кусок кода
procedure TForm1.Button2Click(Sender: TObject);
 var a: Matrix_a;
      b,x:matrix_B;
      d: ******;
      i,j,k,l:integer;
begin
p:=gettickcount;
for i:=1 to n do for j:=1 to n do a[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]);
for i:=1 to n do b[i]:=StrToFloat(StringGrid2.Cells[0,i-1]);
for i:=1 to n-1 do
begin
for k:=i+1 to n do
begin
d:=a[k,i]/a[i,i];
for j:=i+1 to n do
a[k,j]:=a[k,j]-a[i,j]*d;
b[k]:=b[k]-b[i]*d;
end;
end;
for i:=n downto 1 do
begin
for j:=i+1 to n do
b[i]:=b[i]-a[i,j]*x[j];
x[i]:=b[i]/a[i,i];
end;
 //Вывод результата
    Memo2.Lines.Add('Meтодом Гаусса');
     Memo2.Lines.Add(' Количество итераций: '+IntToStr(k));
     Memo2.Lines.Add('Время '+FloatToStrf((gettickcount-p),fffixed,10,1)+'мс');
    for i:=1 to n do Memo2.Lines.Add('x'+inttostr(i)+'='+floattostrf((x[i]),fffixed,12,7));
если заитересует посмотрите прикреплённый файл.
3 ответа

ganterrr

Между вызовами GetTickCount() надо вызвать процедуру решения уравнений по нескольку раз - раз 100 или 1000, например. После этого разность значений по двум вызовам GetTickCount() разделить на соответствующее число - соответственно, на 100 или на 1000.


ganterrr

Можете пожалуйста записать на примере что у меня выше, а то как то не понимаю...Mawrat, помогите по поводу gettickcount
begin
dwstart:=gettickcount();
for o:=1 to 100 do
sleep(1);
d:=a[k,i]/a[i,i];
for j:=i+1 to n do
a[k,j]:=a[k,j]-a[i,j]*d;
b[k]:=b[k]-b[i]*d;
end;
for i:=n downto 1 do
begin
for j:=i+1 to n do
b[i]:=b[i]-a[i,j]*x[j];
x[i]:=b[i]/a[i,i];
dwend:=gettickcount();
dwdiff:=(dwend-dwstart) div 100;
end;
Вот так будет выглядеть??


ganterrr

Ganterrr, sleep() здесь противопоказан. В общем, удобнее поступить так. Метод простых итараций оформить в виде отдельной процедуры. И метод Гаусса - тоже в виде отдельной процедуры. Заголовок процедуры по вычислению приближения простыми итерациями будет выглядеть, наверное, так:
procedure SimpleIter(
  const aArrA : Matrix_a; const aArrB : Matrix_b;
  const **** : Extended; var aIterCnt : Longword
  );
Затем в обработчике нажатия кнопки замеряется усреднённое время выполнения:
procedure TForm1.Button1Click(Sender: TObject);
const
  Rep = 1000;
var
...
  A : Matrix_a
  B : Matrix_b
  i, IterCnt : Integer
  //Время в миллисекундах.
  TimeStart, TimeRes : Extended;
begin
...
  //Инициализация массивов А и B и величины Eps.
...
  //Исследование метода простых итераций.
  TimeStart := GetTickCount;
  for i := 1 to Rep do begin
    SimpleIter(A, B, Eps, IterCnt);
  end;
  //Усреднённое время вычислений по методу простых итераций.
  TimeRes := (GetTickCount - TimeStart) / Rep;
  //В данный момент в переменной IterCnt записано количество выполненных итераций.
...
end;
Аналогично для метода Гаусса.