こんにちは私は、Delphiのコードブロックを実行するためにQueryperformanceCounterを使用しています。何らかの理由で、私がQueryPerformanceCounterを使用して取得したのミリ秒数は、ストップウオッチを使用して私の壁時計の時間と大きく異なります。例えば、ストップウォッチは約33秒ですが、正確ではないと思われますが、QueryPerofomanceCounterを使用すると500ミリ秒のような数値が得られます。なぜQueryperformanceCounterはウォールクロックと異なるタイミングですか?
私のコードをステップ実行すると、CPUのCPU周波数が正しいか、Core2 E6600の場合は、QueryPerformanceFrequencygivesが正しいことがわかります。だから、ティックナンバーが正しければ、(tick number/Freq) * 1000
は私にタイミングのコードの正しい実行時間を与えるはずですが、どうしてですか?
QeuryPerformanceCounterは、MillionSecondsではなく数秒かかるため、おそらく時間がかかりすぎていることを知っていますが、壁時計とQueryPerormanceCounterの時間の違いの理由を理解することにもっと興味があります。
ハードウェアはE6600 Core2で、OSはWindows 7 X64(該当する場合)です。
unit PerformanceTimer;
interface
uses Windows, SysUtils, DateUtils;
type TPerformanceTimer = class
private
fFrequency : TLargeInteger;
fIsRunning: boolean;
fIsHighResolution: boolean;
fStartCount, FstopCount : TLargeInteger;
procedure SetTickStamp(var lInt : TLargeInteger) ;
function GetElapsedTicks: TLargeInteger;
function GetElapsedMiliseconds: TLargeInteger;
public
constructor Create(const startOnCreate : boolean = false) ;
procedure Start;
procedure Stop;
property IsHighResolution : boolean read fIsHighResolution;
property ElapsedTicks : TLargeInteger read GetElapsedTicks;
property ElapsedMiliseconds : TLargeInteger read GetElapsedMiliseconds;
property IsRunning : boolean read fIsRunning;
end;
implementation
constructor TPerformanceTimer.Create(const startOnCreate : boolean = false) ;
begin
inherited Create;
fIsRunning := false;
fIsHighResolution := QueryPerformanceFrequency(fFrequency) ;
if NOT fIsHighResolution then
fFrequency := MSecsPerSec;
if startOnCreate then
Start;
end;
function TPerformanceTimer.GetElapsedTicks: TLargeInteger;
begin
result := fStopCount - fStartCount;
end;
procedure TPerformanceTimer.SetTickStamp(var lInt : TLargeInteger) ;
begin
if fIsHighResolution then
QueryPerformanceCounter(lInt)
else
lInt := MilliSecondOf(Now) ;
end;
function TPerformanceTimer.GetElapsedMiliseconds: TLargeInteger;
begin
result := (MSecsPerSec * (fStopCount - fStartCount)) div fFrequency;
end;
procedure TPerformanceTimer.Start;
begin
SetTickStamp(fStartCount) ;
fIsRunning := true;
end;
procedure TPerformanceTimer.Stop;
begin
SetTickStamp(fStopCount) ;
fIsRunning := false;
end;
end.
10^3^2(1000で間違った乗算)の大きさの差があるので、コードを表示すると助かります –
ちょうど小さなテストを行いました。時間。 50回の加算演算のループにより、1つまたは2つのティックが生成されます。では、QueryPerformanceCounterを使用するとどうなりますか。 –
@pstar:50個の操作を追加することは、あまり効果がありません。確かに 'QueryPerformanceCounter'には何も問題はありません。実際に測定しているコードも表示してください。 – jpfollenius