QueryPerformanceCounter()或Stopwatch.GetTimestamp()可以在后续调用中返回相同的值吗?

时间:2012-03-22 04:51:04

标签: c# windows uniqueidentifier performancecounter

QueryPerformanceCounter()Stopwatch.GetTimestamp()都返回其中一个处理器的滴答计数。我想使用返回的64位整数值作为唯一ID,我想知道这些函数在一个进程中被多次调用时是否可能返回相同的值。

我的进程最多可以一次运行几个小时,这些唯一ID仅暂时使用 - 例如,它们不会保存在数据库中。上述函数将被调用多次,但其间有其他函数调用。

文档指出,主板可能不支持高性能计时器,但我所有的工作都有这种支持。我的代码只能在32位或64位服务器硬件上运行,我相信无论如何都会支持高性能计时器(不过我不确定)。

我可以编写一个小测试程序来测试它,但该测试只能在我自己的计算机上有效,所以我正在寻找一个更明确的答案,如果有的话。

编辑:我知道这些功能不是设计来生成唯一ID,但只要它们生成不断增加的值,就可以了。我问这个问题不仅是出于技术原因,还出于好奇心。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:-1)

如果要将其用于ID,则需要将此值与其他“随机”数字组合使用。但是为了精确,您需要拨打QueryPerformanceCounter(),而不是Stopwatch.GetTimestamp()