c # - Kan QueryPerformanceCounter () eller Stopwatch.GetTimestamp () returnere den samme værdi i efterfølgende opkald?

Indlæg af Hanne Mølgaard Plasc

Problem



QueryPerformanceCounter() og Stopwatch.GetTimestamp() returnerer begge ticketællingen fra en af ​​processorerne. Jeg vil gerne bruge den returnerede 64-bit heltalsværdi som et unikt ID, og ​​jeg spekulerer på, om det er muligt, at disse funktioner returnerer samme værdi, når de bliver kaldt flere gange i en proces. [6] [7]


Min proces vil maksimalt køre i nogle timer ad gangen, og disse unikke id'er bruges kun midlertidigt - de bliver ikke gemt i en database. De ovennævnte funktioner vil blive kaldt flere gange, men med andre funktionsopkald mellem dem.


Dokumentationen siger, at det er muligt, at et bundkort ikke understøtter højtydende timere, men alt jeg har arbejdet med, havde denne støtte. Min kode ville kun køre på 32-bit eller 64-bit server hardware, hvor jeg tror high- performance timers understøttes alligevel alligevel (jeg er ikke sikker på, selvom).


Jeg kunne skrive et lille testprogram for at teste det, men den test ville kun være gyldig på min egen computer, så jeg søger et mere definitivt svar, hvis man er tilgængelig.


Rediger : Jeg ved, at disse funktioner ikke er designet for at generere unikke id'er, men så længe de genererer stadigt stigende værdier, er det fint. Jeg spørger ikke dette spørgsmål kun af tekniske grunde men også af nysgerrighed.

Bedste reference


Ingen af ​​de funktioner, der er designet til at returnere unikke id'er. Faktisk er det sandsynligt, at 2 efterfølgende opkald vil returnere samme værdi.


For unikke identifikatorer skal du overveje at bruge Guid.NewGuid eller blot have mod (interlocked) stigning på hvert 'giv mig ID' opkald. [8]


Bevis for koncept for 'QueryPerformanceCounter' returnerer samme værdi:


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);
}

Andre referencer 1


Hvis du vil bruge det til ID'er, skal du kombinere denne værdi med andre 'tilfældige' tal. Men for præcision skal du ringe QueryPerformanceCounter(), ikke Stopwatch.GetTimestamp().