Comment obtenir la précision de high_resolution_clock?
C++11 définit high_resolution_clock
et il a le membre types period
et rep
. Mais je n'arrive pas à comprendre comment je peux obtenir le précision de l'horloge.
Ou, si je ne peut pas arriver à la précision, je peux en quelque sorte au moins obtenir un décompte en nanosecondes de la minimum représentable durée entre les tiques? probablement à l'aide de period
?
#include <iostream>
#include <chrono>
void printPrec() {
std::chrono::high_resolution_clock::rep x = 1;
//this is not the correct way to initialize 'period':
//high_resolution_clock::period y = 1;
std::cout << "The smallest period is "
<< /* what to do with 'x' or 'y' here? */
<< " nanos\n";
}
- Vous êtes à la recherche pour
std::ratio
? - en partie, mais comment à partir de là?
std::ratio
est essentiellement une compilation valeur utilisée pour la compilation de l'arithmétique. Il n'a pas de membres de l'instance, seulement statique constexpr membres, de sorte 'initialisation' un ratio n'a pas de sens. Vous pouvez faire des choses commestd::ratio_less_equal<std::milli,std::high_resolution_clock::period>::value
qui seratrue
si l'horloge de la période est inférieure ou égale à un millième de seconde.
Vous devez vous connecter pour publier un commentaire.
Le minimum représentable durée est
high_resolution_clock::period::num /high_resolution_clock::period::den
secondes. Vous pouvez l'imprimer comme ceci:Pourquoi est-ce? Une horloge
::period
membre est définie comme "La tique de la période de l'horloge en quelques secondes." C'est une spécialisation destd::ratio
qui est un modèle pour représenter les ratios au moment de la compilation. Il fournit deux constantes intégrales:num
etden
, le numérateur et le dénominateur d'une fraction, respectivement.ratio
s se cachent.Je upvoted R. Martinho Fernandes de répondre parce que je crois qu'il offre le plus clair et le plus simple de répondre à la question. Cependant, je voulais ajouter un peu de code qui a montré un peu plus
<chrono>
fonctionnalité et qui ont abordé cette partie de l'OP question:Et il est impossible de mettre cette quantité d'informations dans un commentaire. Mais sinon je considérer cette réponse comme un commentaire de soutien à R. Martinho Fernandes réponse.
D'abord le code, puis l'explication:
J'ai d'abord créé un
nanosecond
c'est à l'aide d'undouble
que la représentation (NS
). J'ai utilisédouble
juste au cas où j'avais besoin de montrer une fraction de l'ordre de la nanoseconde (par exemple0.5 ns
).Ensuite, chaque réveil est un type imbriqué nommé
duration
. C'est unchrono::duration
qui ont les mêmesstd::ratio
, et donc le mêmenum
etden
comme l'a souligné dans l'arrêt R. Martinho Fernandes de réponse. L'un de cesduration
s, convertie àNS
va nous donner combien de nanosecondes dans un tic d'horloge deClock
. Et cette valeur peut être extraite de laduration
avec lecount()
fonction membre.Pour moi ce programme imprime:
chrono
.chrono::nanoseconds
n'est pas adapté pourNS
? Attendez... je vais l'essayer.typename Clock::duration x{1}; cout << duration_cast<nanoseconds>(x).count() << " ns\n";
je n'ai pas réussi parce que j'ai essayéx = 1
au lieu dex{1}
avant. C'est unexplicit
constructeur alors.NS
si c'est un exact conversion entreClock::duration
etchrono::nanoseconds
. Pour toutes les plates-formes, je suis au courant, cela sera vrai. Toutefois, il est possible queClock::duration
pourrait être une picoseconde. Et dans ce cas, vous devez obtenir au moment de la compilation d'échec lors de la tentative de convertir picosecondes à l'intégrale basée surchrono::nanoseconds
. Mais à l'aide d'une double base de l'ordre de la nanoseconde aurait pour résultat de 0,001 être stockés dansns
.Un
std::ratio
type représentant la tique de la période de l'horloge, en quelques secondes.Définie dans l'espace de nomsstd::chrono