3

Delphi7でミリ秒またはナノ秒のタイマーを探しています。シーケンシャル検索で3つのISAMファイルの速度を確認する必要があります。最初のindファイルには、「record_0」から「record_50」のような50個の文字列が含まれています。2番目の「record_0」から「record_500」および3番目の「record_0」から「record_5000」。私はすべてを実装しましたが、タイマーの作り方がわかりません。文字列を各ISAMファイルの最後の項目と比較しています。これが最初のindファイルの私のコードです:

procedure TForm1.Button1Click(Sender: TObject);
  var i:integer;
  var content : String[20];
  var indexCounter:integer;
  var keyword:string;
begin
  //First ISAM file
  AssignFile(indF1, 'index1.ind');
  ReWrite(indF1);
  Reset(indF1);
  for i:=0 to 49 do begin
    content := 'record_';
    content := content + IntToStr(i+1);
    index1.index1 := content;
    index1.position1 := FileSize(indF1);
    Seek(indF1, FileSize(indF1));
    write(indF1, index1);
  end;
  CloseFile(indF1);
  Label12.Caption := FileSizeStr('index1.ind');

  //Sequential search in first ind file
  Reset(indF1);
  keyword := 'record_50';
  indexCounter := 0;
  //start timer
  while not Eof(indF1) do begin
    Seek(indF1, indexCounter);
    Read(indF1, Index1);
    if (keyword = Index1.index1) then begin
      //stop timer;
      //Label20 := milliseconds/nanoseconds;
      //return/break while loop (result := -1; exit;) ???
    end;
    indexCounter := indexCounter + 1;
  end;

プロシージャ/関数が必要です。これを呼び出すと、ミリ秒またはナノ秒でカウントを開始し、文字列が見つかったときに停止し(各indファイルの最後の文字列です)、すべてのファイルをトラバースするための経過時間を表示します。また、whileループを解除する方法もわかりません。前もって感謝します。

4

4 に答える 4

11

ここTStopWatchで説明するクラスに"delphi-high-performance-timer-tstopwatch"は、必要なすべての関数が含まれています(Delphi-7の場合)。

これは、後のDelphiバージョン(Delphi-2010)で、ユニット診断の高度なレコードとして実装されています。

例:

var
  sw : TStopWatch;
  elapsedMilliseconds : cardinal;
begin
  ...
  sw := TStopWatch.Create() ;
  try
    sw.Start;

    while not Eof(indF1) do begin
      Seek(indF1, indexCounter);
      Read(indF1, Index1);
      if (keyword = Index1.index1) then begin
        sw.Stop;
        Label20.Caption := IntToStr(sw.ElapsedMilliseconds);
        break; // break while loop
      end;
      indexCounter := indexCounter + 1;
    end;
    ...
  finally
    sw.Free;
  end;
end;

whileループを解除するにはbreak;、条件付きテストの内部で実行します。

于 2013-02-12T14:23:33.860 に答える
9

QueryPerformanceFrequencyQueryPerformanceCounterを使用します。最初の関数は1秒あたりの単位数を返し、2番目の関数は値を返します。

lFreq: Int64;
InitialF, FinalF: Int64;

if QueryPerformanceFrequency(lFreq) then
  // hi-res timer is supported
else
  // hi-res timer is not supported

QueryPerformanceCounter(InitialF);
// do something you want to time
QueryPerformanceCounter(FinalF);
// duration of the time of something is FinalF - InitialF in "units"
// divide by lFreq to get the amount of time in seconds, 
// this will be an Extended type.
于 2013-02-12T15:11:23.543 に答える
4

この単純なコードが見つかりました:

var
 StartTime : Cardinal;
begin
  StartTime := GetTickCount;
  //code to do
  ShowMessage(Format('Elapsed time %d ms', [GetTickCount - StartTime])); 
于 2013-02-12T23:02:43.540 に答える
1

JediJCLのJclCounterを使用します。または、Jediを使用したくない場合は、WinApiQueryPerformanceCounterを使用してください。

于 2013-02-12T14:17:45.253 に答える