import ctypes
import time
# Carregar as funções necessárias da API do Windows para alta precisão
winmm = ctypes.WinDLL('winmm')
kernel32 = ctypes.WinDLL('kernel32')
def test_sleep_precision(duration_ms=1, iterations=100):
"""
Mede a estabilidade real de uma pausa de 1 ms.
"""
total_time = 0
measured_times = []
# 1. Configurar o relógio do Windows para a resolução máxima de 1 ms
# Sem isto, o sleep mínimo do Windows é de ~15.6ms
winmm.timeBeginPeriod(1)
# Obter a frequência do relógio de alta resolução do hardware
frequency = ctypes.c_int64()
kernel32.QueryPerformanceFrequency(ctypes.byref(frequency))
freq = frequency.value
start_perf = ctypes.c_int64()
end_perf = ctypes.c_int64()
for _ in range(iterations):
kernel32.QueryPerformanceCounter(ctypes.byref(start_perf))
# Pausa de 1ms (Aproximação pelo OS)
time.sleep(duration_ms / 1000.0)
kernel32.QueryPerformanceCounter(ctypes.byref(end_perf))
# Calcular o tempo exato decorrido em milissegundos
elapsed_ms = ((end_perf.value - start_perf.value) * 1000.0) / freq
measured_times.append(elapsed_ms)
# 2. Restaurar a resolução padrão do sistema operativo
winmm.timeEndPeriod(1)
# Estatísticas do teste académico
avg_time = sum(measured_times) / iterations
min_time = min(measured_times)
max_time = max(measured_times)
print(f"--- Resultados para {duration_ms}ms planeado ---")
print(f"Média Real: {avg_time:.3f} ms")
print(f"Mínimo: {min_time:.3f} ms")
print(f"Máximo: {max_time:.3f} ms")
print(f"Jitter (Instabilidade): {max_time - min_time:.3f} ms")
if __name__ == "__main__":
print("A executar teste de precisão temporal...")
test_sleep_precision(duration_ms=1, iterations=50)


