Geralmente, timeGetTime () é melhor para a lógica do jogo de temporização - GetTickCount não possui resolução suficientemente alta e QPC e RDTSC são muito mais problemas do que valem para esse fim.
Por outro lado, para criação de perfil, RDTSC ou QPC pode valer a pena. Eu prefiro RDTSC sobre QPC, embora a Microsoft recomende QPC.
As quatro funções de tempo comuns que eu uso no win32:
GetTickCount () retorna o tempo atual em milissegundos em relação a algum zero arbitrário (geralmente, embora nem sempre o tempo de inicialização do sistema), como um número inteiro de 32 bits (para que ocorra a cada 49 dias). Geralmente é o método mais rápido para medir um tempo. Infelizmente, é de baixa resolução - geralmente atualiza apenas 64 vezes por segundo. Ao contrário do boato popular, chamar timeBeginPeriod (1) não aumentará sua resolução em nenhum sistema que eu tenha testado. Há também uma variante de 64 bits, se você estiver preocupado com a quebra.
timeGetTime () retorna o tempo atual, em milissegundos, relativo a algum zero arbitrário, como um valor de 32 bits (para que ocorra após 49 dias ou mais). Não é tão rápido quanto GetTickCount, mas ainda é bastante razoável. Pode ser preciso em um único milissegundo, embora isso possa exigir a chamada timeBeginPeriod (1) primeiro. O uso do timeGetTime requer a vinculação ao winmm.lib e a inclusão do Mmsystem.h.
QueryPerformanceCounter () retorna o horário atual em unidades arbitrárias como um número inteiro de 64 bits. Você pode descobrir quais são as unidades chamando QueryPerformanceFrequency () e as unidades não serão alteradas (na ausência de uma reinicialização). A implementação subjacente disso varia muito, e cada implementação possui suas próprias peculiaridades e erros que podem ocorrer em algum hardware, tornando isso desagradável para uso em aplicativos amplamente implantados. Algumas implementações são muito lentas, outras são razoáveis, embora nenhuma seja tão rápida quanto GetTickCount ou mesmo timeGetTime. Normalmente, a resolução de tempo é melhor que 1 microssegundo, embora não necessariamente muito melhor.
RDTSC é um código de operação da linguagem assembly x86 / x64 que retorna o tempo atual em unidades de ciclos da CPU (ou seja, como um número inteiro de 64 bits. Em alguns compiladores, ele pode ser acessado como um intrínseco (__rdstc), em outros você precisará de asm inline. Sua velocidade varia um pouco entre as CPUs, mas geralmente é bastante razoável - geralmente significativamente mais rápida que QueryPerformanceCounter, mas não tão rápida quanto GetTickCount.Infelizmente, existem algumas peculiaridades - não tantas quanto QueryPerformanceCounter, mas ainda muito mais que as funções de tempo de resolução mais baixa. Às vezes, pode ser executado em versões anteriores em CPUs multicore quando você alterna núcleos devido à sincronização imperfeita entre os núcleos, as unidades são difíceis de descobrir e as unidades podem mudar no meio do tempo devido ao gerenciamento de energia alterando a taxa do clock da CPU.
Observe que cada um desses quatro métodos pode ser desviado em relação aos outros três - não há um fluxo de tempo claro e autorizado.