Могут ли QueryPerformanceCounter () или Stopwatch.GetTimestamp () возвращать одно и то же значение при последующих вызовах? - PullRequest
1 голос
/ 22 марта 2012

QueryPerformanceCounter() и Stopwatch.GetTimestamp() оба возвращают счетчик тиков одного из процессоров.Я хотел бы использовать возвращенное 64-разрядное целочисленное значение в качестве уникального идентификатора, и мне интересно, возможно ли, чтобы эти функции возвращали одно и то же значение, когда они вызывались несколько раз в процессе.

Мой процесс будетзапускать не более нескольких часов одновременно, и эти уникальные идентификаторы используются только временно - например, они не сохраняются в базе данных.Вышеуказанные функции будут вызываться несколько раз, но с другими вызовами функций между ними.

В документации говорится, что, возможно, материнская плата не поддерживает высокопроизводительные таймеры, но все, с чем я работал, имело эту поддержку.Мой код работал бы только на 32-битном или 64-битном серверном оборудовании, где я считаю, что высокопроизводительные таймеры всегда поддерживаются (хотя я не уверен).

Я мог бы написать небольшую тестовую программу дляпротестируйте его, но этот тест будет действителен только на моем собственном компьютере, поэтому я ищу более точный ответ, если таковой имеется.

Редактировать : я знаю, что эти функции не предназначен для генерации уникальных идентификаторов, но пока они генерируют постоянно растущие значения, это нормально.Я задаю этот вопрос не только по техническим причинам, но и из любопытства.

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Ни одна из функций не предназначена для возврата уникальных идентификаторов.Фактически, вероятно, что 2 последующих вызова вернут одно и то же значение.

Для уникальных идентификаторов рассмотрите возможность использования Guid.NewGuid или просто используйте счетчик с (блокированным) приращением для каждого "дай мне идентификатор"call.

Подтверждение концепции для "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 голосов
/ 22 марта 2012

Если вы хотите использовать его для идентификаторов, вам нужно объединить это значение с другим «случайным» числом.Но для точности вам нужно позвонить QueryPerformanceCounter(), а не Stopwatch.GetTimestamp().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...