logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog

follow us in feedly

Lendo e medindo o tempo em C e C++: GetTickCount

GetTickCount é uma função da api Win32, portanto disponível somente no Windows. Qualquer versão do Windows desde o Windows 95 disponibiliza essa função.

Características:

  • Retorna a quantidade de milissegundos desde a inicialização do Windows, portanto, não pode ser usada para horário, somente para medição de tempo;
  • Sua precisão é de no máximo 15ms. Ou seja, se você medir seguidamente o tempo com GetTickCount você nunca terá um intervalo entre 0 e 15 milisegundos;
  • Só funciona no Windows;
  • É a forma mais rápida de medir tempo no Windows, ou seja, a chamada desse função demora pouco em relação aos outros método. Esse valor é atualizado pelo timer do sistema, então, eu suponho, que ele seja somente uma leitura nas memória.

Código:

int main()
{
  DWORD start = GetTickCount();

  AlgumaCoisaQueDemoraBastante();

  DWORD elapsed = GetTickCount - start;

  cout << "AlgumaCoisaQueDemoraBastante levou " << elapsed << " milissegundos para rodar" << endl;

}

Eu já recebi algumas planilhas com números de medição de performance onde os intervalos nunca eram menores do que 15ms, e algumas vezes o código medido levada 0ms. Esse é o problema em usar um timer sem resolução suficiente para mensurar o tempo de um trecho de código. Você pode usar o GetTickCount para medir tempo, contanto que você saiba das limitações.

A maior vantagem do GetTickCount é ser uma função que, no Windows, leva o menor tempo para te retornar uma referência de tempo. Consequentemente, interfere bem menos no tempo que será medido.

Veja também: Lendo e medindo o tempo em C e C++: função time()

Referência: GetTickCount na MSDN


Em 01/08/2011 19:29, por Rodrigo Strauss


  
 
 
Comentários
Wanderley Caloni | website | e-mail | em 01/08/2011 | #
Essa função pega o número de tiques do sistema como um todo. Em um ambiente multithreading, multitasking e preemptivo como o Windows é, existe uma grande chance da medição ser alterada por "fatores externos" (uma gravação de cache no momento da execução do código, por exemplo).

Para obter o tempo exato que uma thread levou, inclusive com separação entre kernel mode x user mode, nada como perguntar para o próprio kernel (mas é essa a função dele, mesmo!).

A função GetThreadTimes retorna o tempo de início de uma thread, tempo de fim (se tiver sido finalizada) e os tempos que foram gastos em user e kernel mode.

A precisão é a mesma do kernel, que é de 100 nanosegundos.

[]s
Fábio | em 04/08/2011 | #
Essa função é implementada desde a idade da pedra, lembro de estar lendo Advanced Windows e Jefrey Richter usá-la nos códigos de exemplos. Esse post foi bom para eu quebrar alguns preconceitos :-)
Algo a dizer?
Nome:


Site:


E-mail:


Escreva o número vinte e seis:


 Não mostre meu e-mail no site, não serve pra nada mesmo...

Comentário





Os comentários devem ser sobre assuntos relativos ao post, eu provavelmente apagarei comentários totalmente offtopic. Se quiser me enviar uma mensagem, use o formulário de contato. E não esqueça: isso é um site pessoal e eu me reservo o direito de apagar qualquer comentário ofensivo ou inapropriado.
rebarba rebarba
  ::::