Cross Platform Millissegund Timer com mais de 49 dias?
-
24-09-2019 - |
Pergunta
Vou desenvolver um pequeno servidor dedicado em C/C ++ que exigirá tempo de atividade para sempre. Eu tenho analisado algumas funções de tempo, pois o tempo de milissegundos é necessário para os cálculos. Tenho 2 problemas que estou enfrentando:
O uso de um número inteiro de 32 bits para armazenar o número de milissegundos desde o início da operação será envolvido em cerca de 49 dias de redefinição para zero. Eu pensei em usar números inteiros de 64 bits, usando o gettimeofday para recuperar microssegundos, mas isso me leva à segunda parte.
Não parece haver nenhum sistema padrão para obter milissegundos decorridos que são a plataforma independente
O que devo fazer para resolver esses dois problemas?
Solução
Use um número inteiro de 64 bits, presumindo que lhe dê tempo suficiente
Você está certo; não há padrão. Uma possibilidade seria usar o Boost DateTime Biblioteca, alternadamente, encontre outro ou role o seu próprio.
Boa sorte!
Outras dicas
Como já foi dito, o primeiro problema que você vai confrontar vai obter um tempo confiável para o milissegundo.
Admito que sou um pouco faseado pela pergunta.
Eu posso entender a necessidade de tempo preciso (nível de milissegundo, até microssegundo), mas o tempo de 50 dias em um nível de milissegundos parece ... estranho.
Talvez você deva revisar sua necessidade primeiro, mas é raro precisar de mais de 6 ou 7 dígitos significativos ... e tenho medo de que você esteja tentando obter um tamanho único para todos os objetos de duração.
Talvez você deva classificar suas durações:
- Alguns minutos na maioria> Use a precisão de milissegundos
- Caso contrário> Use a segunda precisão (a famosa contagem desde 1º de janeiro de 1970)
Porque ... qual é o sentido de 1/10 segundo na escala de 2 meses?
Óbvio. Use números inteiros de 64 bits com código específico da plataforma para obter o número de milissegundos. No Unix, incluindo OSX, você quer gettimeofday
. No Windows, boa sorte obtendo uma fonte de tempo confiável de milissegundos-granularidade; a Código na biblioteca TCL para fazer isso é realmente complexo, pois existem algumas pegadinhas no mal na área.
Resposta a 1: Se o "tempo de milissegundos" que você está medindo estiver em cerca de 20 dias, você poderá subtrair os tempos como valores não assinados e verificar o resultado como valor assinado. Isso deve dar o resultado certo com os temporizadores de embalagem (embalando de 0xffffffffff a 0x00000000). Se o seu tempo for superior a 20 dias, você precisará de mais bits.