3
votes

std :: chrono :: millisecondes .count () renvoie en microsecondes?

J'essaie d'enregistrer les millisecondes de temps écoulées sur une période donnée.

J'ai une classe comme celle-ci

void MyClass::func2CalledFromADifferentThread() {

    // after some time following line of code runs from a different thread
    auto end = high_resolution_clock::now();

    m_elapsed = duration_cast<milliseconds>(end - m_start);
    std::cout << "Elapsed time in milliseconds is " << m_elapsed.count()/1000 << std::endl;
}

J'ai 2 méthodes dans classe. L'un est appelé à partir de main qui est func1CalledFromMainThread .

// Class methods
using namespace std::chrono;
void MyClass::func1CalledFromMainThread() {

    m_start = std::chrono::high_resolution_clock::now();
}

Et un autre qui est func2CalledFromADifferentThread est appelé à partir d'un autre thread

// class member declarations
class MyClass {

    std::chrono::high_resolution_clock::time_point   m_start;
    std::chrono::system_clock::duration              m_elapsed;
};

Le Le problème est dans la journalisation cout . Je vois que je dois diviser par 1000 pour obtenir des millisecondes de m_elapsed . count ne renvoie-t-il pas ici le nombre de std :: chrono :: millisecondes ? Pourquoi devrais-je diviser par 1000 ici? count () renvoie-t-il toujours en microsecondes ou est-ce que je fais une erreur?


3 commentaires

Puisque vous accédez à m_start à partir de différents threads, vous devriez regarder dans std :: mutex .


Voici un didacticiel vidéo : youtube.com/watch? v = P32hvk8b13M


@Angew. Oui, j'ai les mutex dans le code réel qui est beaucoup plus complexe que cet exemple. Je viens de créer un exemple de code pour discuter et comprendre le problème sans y impliquer trop de détails, ce qui a fonctionné je pense. Merci beaucoup pour la réponse utile


3 Réponses :


3
votes

count renvoie le nombre de graduations du type sur lequel vous l'appelez. Si vous écriviez ceci:

duration_cast<milliseconds>(end - m_start).count()

cela vous donnerait correctement le nombre de millisecondes. Cependant, vous ne stockez pas le résultat dans std :: chrono :: millisecondes , vous le stockez dans std :: chrono :: system_clock :: duration (le type de m_elapsed ). Par conséquent, m_elapsed.count () renvoie le nombre de ticks dans la fréquence de std :: chrono :: system_clock :: duration , qui est probablement de l'ordre de quelques microsecondes sur votre plateforme.

En d'autres termes, vous annulez immédiatement la conversion en millisecondes en stockant le résultat dans autre chose que millisecondes .

p >


0 commentaires

1
votes

Vous stockez la durée en utilisant des unités system_clock :: duration et non en millisecondes .

Le problème dans votre cas est que std :: chrono :: system_clock :: duration n'utilise pas la milliseconde car les ticks comptent. Lors de l'exécution de cette ligne m_elapsed = duration_cast (end - m_start); , Peu importe que vous convertissiez d'abord l'heure en milli en utilisant une duration_cast , le nombre de ticks sera toujours converti en system_clock :: duration unité de durée qui se trouvent être microsecondes .

Je déclarerais simplement m_elapsed comme std :: chrono :: duration et cela devrait fonctionner comme prévu.


0 commentaires

0
votes

J'ai rencontré un problème similaire et je l'ai résolu par un simple changement de:

auto m_elapsed;

à:

std::chrono::system_clock::duration              m_elapsed;


0 commentaires