Недавно я решил, что мне нужно перейти от использования миллисекунд к микросекундам для моего класса Timer, и после некоторых исследований я решил, что QueryPerformanceCounter, вероятно, моя самая безопасная ставка. (Предупреждение о Boost::Posix
том, что он может не работать в Win32 API, меня немного оттолкнуло). Однако я не совсем уверен, как это реализовать.
Я вызываю любую GetTicks()
функцию esque, которую использую, и назначаю ее startingTicks
переменной Timer . Затем, чтобы узнать количество прошедшего времени, я просто вычитаю возвращаемое значение функции из startingTicks
, а когда я сбрасываю таймер, я просто снова вызываю функцию и назначаю ей startTicks. К сожалению, из кода, который я видел, это не так просто, как просто вызов QueryPerformanceCounter()
, и я не уверен, что я должен передать в качестве аргумента.
Ответы:
Эта программа должна вывести число, близкое к 1000 (спящий режим Windows не такой точный, но должен быть как 999).
StartCounter()
Функция записывает число клещей счетчика производительности имеет вCounterStart
переменном.GetCounter()
Функция возвращает количество миллисекунд , прошедших сStartCounter()
последней называлась как двойной, так что, еслиGetCounter()
возвращается 0.001 , то это было около 1 мкс , такStartCounter()
называется.Если вы хотите, чтобы таймер использовал секунды вместо этого, измените
к
или если вам нужны микросекунды, используйте
Но на самом деле все дело в удобстве, поскольку оно возвращает двойное значение.
источник
On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL).
этот код не сильно испорчен, но есть BIOS или HAL.StartCounter
функцию следующий вызов :old_mask = SetThreadAffinityMask(GetCurrentThread,1);
а затем вернул его в конецSetThreadAffinityMask ( GetCurrentThread , old_mask ) ;
. Я надеюсь, что это поможет. Это должно предотвратить перенос моего потока на что-либо, кроме 1-го ядра процессора. (Очевидно, что это только решение для тестовой среды)Я использую эти определения:
Использование (скобки для предотвращения переопределения):
Вывод из примера использования:
источник
Предполагая, что вы работаете в Windows (если это так, вы должны пометить свой вопрос как таковой!), На этой странице MSDN вы можете найти источник простого и полезного
HRTimer
класса C ++, который обертывает необходимые системные вызовы для выполнения чего-то очень близкого к тому, что вам нужно (можно было бы легко добавитьGetTicks()
к нему метод, в частности, чтобы делать именно то , что вам нужно).На платформах, отличных от Windows, функция QueryPerformanceCounter отсутствует, поэтому решение не будет напрямую переносимым. Однако, если вы обернете его в такой класс, как вышеупомянутый
HRTimer
, будет легче изменить реализацию класса, чтобы использовать то, что действительно может предложить текущая платформа (возможно, через Boost или что-то еще!).источник
Я бы расширил этот вопрос на пример драйвера NDIS, чтобы узнать время. Как известно, KeQuerySystemTime (имитируемый в NdisGetCurrentSystemTime) имеет низкое разрешение, превышающее миллисекунды, и есть некоторые процессы, такие как сетевые пакеты или другие IRP, которым может потребоваться лучшая временная метка;
Пример такой же простой:
где делитель 10 ^ 3 или 10 ^ 6 в зависимости от требуемого разрешения.
источник