2012-03-22 13 views
1

QueryPerformanceCounter()およびStopwatch.GetTimestamp()はどちらも、プロセッサの1つからティックカウントを返します。返された64ビットの整数値を一意のIDとして使用したいと思います。これらの関数がプロセス内で複数回呼び出されたときに同じ値を返す可能性があるのだろうかと思います。QueryPerformanceCounter()またはStopwatch.GetTimestamp()は、後続の呼び出しで同じ値を返すことができますか?

プロセスはたかだか数時間しか実行されず、これらの一意のIDは一時的にしか使用されません。たとえば、データベースに保存されません。上記の関数は数回呼び出されますが、間には他の関数呼び出しがあります。

マザーボードは高性能タイマーをサポートしていない可能性があると述べています。私のコードは、32ビットまたは64ビットのサーバハードウェア上でのみ動作し、高性能タイマは常にサポートされていると私は思っています(私は確信していません)。

私はそれをテストするための小さなテストプログラムを書くことができましたが、そのテストは自分のコンピュータ上でのみ有効なので、より確かな答えがあればそれを探しています。

編集:私は、これらの機能は、ユニークなIDを生成するためにを設計しではありません知っているが、限り、彼らは常に増加する値を生成するように、それは大丈夫です。私は技術的な理由だけでなく、好奇心からもこの質問をしています。

答えて

2

いずれの関数も一意のIDを返すように設計されていません。実際には、後続の2つの呼び出しで同じ値が返される可能性があります。

一意の識別子の場合は、Guid.NewGuidを使用するか、それぞれの "give me ID"コールでカウンター(連動)インクリメントを使用することを検討してください。 「QueryPerformanceCounterの」のコンセプトの

証明が同じ値を返します。

class Test 
{ 
    void Main() 
    { 
    long start1;  
    long start2; 
    QueryPerfCounter.QueryPerformanceCounter(out start1); 
    QueryPerfCounter.QueryPerformanceCounter(out start2); 

    System.Console.WriteLine(start1); 
    System.Console.WriteLine(start2); 
    } 

    [System.Runtime.InteropServices.DllImport("KERNEL32")] 
    public static extern bool QueryPerformanceCounter(out long lpPerformanceCount); 
} 
+0

私はそれらがユニークなIDを返すのではないことを知っていますが、値が常に増加していればそれは問題ありません。なぜ彼らは同じ価値を返すと思われるのですか? – xxbbcc

+0

両方とも、タイマーの現在の値を表示します.2つの後続の呼び出しは、同じ「時間」を表示するようにします。編集された回答のサンプルを実行して結果を表示します。 –

+0

@xxbbccユニークなIDを生成するように設計されたメソッドを使用するのが簡単であるときに、なぜそうするように設計されていないメソッドを使用するのか? – Yaur

-1

あなたはIDのためにそれを使用したい場合は、あなたが他の「ランダム」番号で、この値を結合する必要があります。しかし、精度のためQueryPerformanceCounter()に電話する必要がありますが、Stopwatch.GetTimestamp()には電話しないでください。

+0

-1。両方とも同じ値を返します。[Stopwatch。GetTimestamp](http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.gettimestamp(v = vs.100).aspx)を参照してください。 –