J'essaie d'utiliser les statistiques "rusage" dans mon programme pour obtenir des données similaires à celles de l'outil time. Cependant, je suis assez sûr que je fais quelque chose de mal. Les valeurs semblent à peu près correctes mais peuvent parfois être un peu bizarres. Je n'ai pas trouvé de bonnes ressources en ligne. Est-ce que quelqu'un sait comment le faire mieux?"rusage" statistics
Désolé pour le code long.
class StopWatch {
public:
void start() {
getrusage(RUSAGE_SELF, &m_begin);
gettimeofday(&m_tmbegin, 0);
}
void stop() {
getrusage(RUSAGE_SELF, &m_end);
gettimeofday(&m_tmend, 0);
timeval_sub(m_end.ru_utime, m_begin.ru_utime, m_diff.ru_utime);
timeval_sub(m_end.ru_stime, m_begin.ru_stime, m_diff.ru_stime);
timeval_sub(m_tmend, m_tmbegin, m_tmdiff);
}
void printf(std::ostream& out) const {
using namespace std;
timeval const& utime = m_diff.ru_utime;
timeval const& stime = m_diff.ru_stime;
format_time(out, utime);
out << "u ";
format_time(out, stime);
out << "s ";
format_time(out, m_tmdiff);
}
private:
rusage m_begin;
rusage m_end;
rusage m_diff;
timeval m_tmbegin;
timeval m_tmend;
timeval m_tmdiff;
static void timeval_add(timeval const& a, timeval const& b, timeval& ret) {
ret.tv_usec = a.tv_usec + b.tv_usec;
ret.tv_sec = a.tv_sec + b.tv_sec;
if (ret.tv_usec > 999999) {
ret.tv_usec -= 1000000;
++ret.tv_sec;
}
}
static void timeval_sub(timeval const& a, timeval const& b, timeval& ret) {
ret.tv_usec = a.tv_usec - b.tv_usec;
ret.tv_sec = a.tv_sec - b.tv_sec;
if (a.tv_usec < b.tv_usec) {
ret.tv_usec += 1000000;
--ret.tv_sec;
}
}
static void format_time(std::ostream& out, timeval const& tv) {
using namespace std;
long usec = tv.tv_usec;
while (usec >= 1000)
usec /= 10;
out << tv.tv_sec << '.' << setw(3) << setfill('0') << usec;
}
}; // class StopWatch
Je ne suis pas sûr de ce que vous voulez dire par le nombre de chiffres en usec variant. Pour autant que je sache, toutes les valeurs sont comprises entre 0 et 999.999, correspondant respectivement à 0 ms et 999.999 ms. "Les trois chiffres les plus significatifs" signifiaient que vous vouliez le nombre de millisecondes. Ai-je lu quelque chose de mal? –
Chris, le @ tag ne semble pas fonctionner de toute façon. A propos de votre commentaire: Je ne travaille plus sur ce code et je ne sais plus exactement ce que je voulais obtenir. : -/AFAIR Je voulais calculer les nombres 999 dans votre réponse, c'est-à-dire * pas * ceux que vous avez listés comme "devraient être". Je pense maintenant que tu avais raison. –