2 つの値の 10 進文字列表現を連結したくないことは確かです。RTDSC
これは、 から返された 2 つの 32 ビット値を 64 ビット値に結合する方法ではありません。
46523 と 1236 を組み合わせても 465231236 にはなりません。これは間違った答えです。代わりに、上位 32 ビットを取得し、下位 32 ビットと並べて配置します。
と を組み合わせ$0000B5BB
て$00004D4
います。正解は、2 つの値のどちらが上位部分と下位部分である$0000B5BB00004D4
か$00004D40000B5BB
に応じて、 または です。
たとえば、次を使用してコードでこれを実装しますInt64Rec
。
var
Value: UInt64;
...
Int64Rec(Value).Lo := Lo;
Int64Rec(Value).Hi := Hi;
ここでLo
、 およびHi
は、 によって返される下位および上位の 32 ビット値ですRTDSC
。
したがって、ビット 0 ~ 31 は の値に設定され、Lo
ビット 32 ~ 63 は の値に設定されますHi
。
または、ビット演算を使用して記述することもできます。
Value := (UInt64(Hi) shl 32) or UInt64(Lo);
タイムスタンプカウンターを読み取るだけでよい場合は、これを行う必要はありません。次のように関数を実装できます。
function TimeStampCounter: UInt64;
asm
RDTSC
end;
レジスタの呼び出し規則では、64 ビット値の戻り値が で呼び出し元に返される必要がありますEDX:EAX
。これらの正確なレジスタに値を配置するためRDTSC
(ちなみに偶然ではありません)、これ以上何もする必要はありません。
TStopWatch
以上のことから、通常は、タイムスタンプ カウンターを使用するよりも、 fromによってラップされるパフォーマンス カウンターを使用する方が望ましいと言えSystem.Diagnostics
ます。