Recentemente, decidi que precisava mudar de milissegundos para microssegundos para minha classe Timer e, depois de alguma pesquisa, decidi que QueryPerformanceCounter é provavelmente minha aposta mais segura. (O aviso de Boost::Posix
que pode não funcionar na API do Win32 me desanima). No entanto, não tenho certeza de como implementá-lo.
O que estou fazendo é chamar qualquer GetTicks()
função esque que estou usando e atribuí-la à startingTicks
variável do temporizador . Em seguida, para descobrir a quantidade de tempo que passou, apenas subtraio o valor de retorno da função de startingTicks
, e quando eu zero o cronômetro, chamo a função novamente e atribuo a ela os marcadores de início. Infelizmente, pelo código que vi, não é tão simples quanto chamar QueryPerformanceCounter()
e não tenho certeza do que devo passar como argumento.
Respostas:
Este programa deve gerar um número próximo a 1000 (o Windows Sleep não é tão preciso, mas deve ser como 999).
A
StartCounter()
função registra o número de ticks que o contador de desempenho possui naCounterStart
variável. AGetCounter()
função retorna o número de milissegundos desde queStartCounter()
foi chamada pela última vez como um double, portanto, seGetCounter()
retornar 0,001, já se passou cerca de 1 microssegundo desde queStartCounter()
foi chamada.Se você quiser que o cronômetro use segundos em vez disso, mude
para
ou se você quiser microssegundos, use
Mas realmente é uma questão de conveniência, pois retorna um duplo.
fonte
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).
Este código não é muito falho, mas algum BIOS ou HAL.StartCounter
função:old_mask = SetThreadAffinityMask(GetCurrentThread,1);
e a defini novamente no finalSetThreadAffinityMask ( GetCurrentThread , old_mask ) ;
. Espero que isso resolva o problema. Isso deve evitar que meu thread seja reprogramado para qualquer coisa, exceto o primeiro núcleo da CPU. (O que obviamente é apenas uma solução para um ambiente de teste)Eu uso estas definições:
Uso (colchetes para evitar redefinições):
Resultado do exemplo de uso:
fonte
Supondo que você esteja no Windows (se estiver, você deve marcar sua pergunta como tal!), Nesta página do MSDN você pode encontrar a fonte de uma
HRTimer
classe C ++ simples e útil que envolve as chamadas de sistema necessárias para fazer algo muito próximo do que você precisa (seria fácil adicionar umGetTicks()
método a ele, em particular, para fazer exatamente o que você precisa).Em plataformas não Windows, não há função QueryPerformanceCounter, portanto, a solução não será diretamente portátil. No entanto, se você envolvê-lo em uma classe como a mencionada acima
HRTimer
, será mais fácil mudar a implementação da classe para usar o que a plataforma atual é realmente capaz de oferecer (talvez via Boost ou qualquer outra coisa!).fonte
Gostaria de estender esta questão com um exemplo de driver NDIS sobre como obter tempo. Como se sabe, KeQuerySystemTime (imitado em NdisGetCurrentSystemTime) tem uma resolução baixa acima de milissegundos, e existem alguns processos como pacotes de rede ou outros IRPs que podem precisar de um carimbo de data / hora melhor;
O exemplo é tão simples:
onde divisor é 10 ^ 3 ou 10 ^ 6 dependendo da resolução necessária.
fonte