logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog


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 | 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 :-)
rebarba rebarba
  ::::