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ます。