2012-03-22 18 views
1

QueryPerformanceCounter()Stopwatch.GetTimestamp()都返回來自其中一個處理器的滴答計數。我想使用返回的64位整數值作爲唯一的ID,我想知道這些函數在進程中多次調用時是否可能返回相同的值。可以QueryPerformanceCounter()或Stopwatch.GetTimestamp()在後續調用中返回相同的值嗎?

我的進程一次最多隻能運行幾個小時,而這些唯一ID只是暫時使用 - 例如它們不會保存在數據庫中。上面的函數會被調用幾次,但是會有其他的函數調用。

該文檔指出,主板可能不支持高性能計時器,但我曾與之合作過的所有人都有此支持。我的代碼只能運行在32位或64位服務器硬件上,我相信無論如何總是支持高性能計時器(但我不確定)。

我可以編寫一個小測試程序來測試它,但該測試只會在我自己的計算機上有效,所以我正在尋找一個更確切的答案,如果有的話。

編輯:我知道這些功能都沒有設計生成唯一的ID,但只要他們產生日益增加的價值,它的罰款。我問這個問題不僅是出於技術原因,而且出於好奇。

回答

2

這兩種函數都不是用來返回唯一的ID。實際上,後續調用可能會返回相同的值。

對於唯一標識符,請考慮使用Guid.NewGuid或者只需在每個「給我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

我知道他們不是*設計* tp返回唯一的ID,但如果他們返回不斷增加的值,那很好。你爲什麼說他們可能會返回相同的值? – xxbbcc 2012-03-22 05:06:31

+0

兩者都顯示一個計時器的當前值 - 兩個隨後的調用顯示相同的「時間」 - 在編輯的答案中運行樣本以查看結果。 – 2012-03-22 05:17:35

+0

@xxbbcc當它很容易使用被設計爲生成唯一標識符的方法時,爲什麼你會用自己的方式來使用那些沒有設計的方法? – Yaur 2012-03-22 05:30:48

-1

如果你想使用它的ID,你需要這個值與其他「隨機」數相結合。但爲了精確,您需要撥打QueryPerformanceCounter(),而不是Stopwatch.GetTimestamp()

+0

-1。兩者返回相同的值請參閱[秒錶。GetTimestamp](http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.gettimestamp(V = VS.100)的.aspx)。 – 2012-03-22 05:20:21

相關問題