0 - Delta
Utilisez une fonction delta pour calculer les différences de temps :
auto start = std::chrono::steady_clock::now();
std::cout << "Elapsed(ms)=" << since(start).count() << std::endl;
since
accepte n'importe quel point de temps et produit n'importe quelle durée (les millisecondes sont la valeur par défaut). Il est défini comme suit :
template <
class result_t = std::chrono::milliseconds,
class clock_t = std::chrono::steady_clock,
class duration_t = std::chrono::milliseconds
>
auto since(std::chrono::time_point<clock_t, duration_t> const& start)
{
return std::chrono::duration_cast<result_t>(clock_t::now() - start);
}
Demo
1 - Minuterie
Utiliser une minuterie basée sur std::chrono
:
Timer clock; // Timer<milliseconds, steady_clock>
clock.tick();
/* code you want to measure */
clock.tock();
cout << "Run time = " << clock.duration().count() << " ms\n";
Demo
Timer
est défini comme suit :
template <class DT = std::chrono::milliseconds,
class ClockT = std::chrono::steady_clock>
class Timer
{
using timep_t = typename ClockT::time_point;
timep_t _start = ClockT::now(), _end = {};
public:
void tick() {
_end = timep_t{};
_start = ClockT::now();
}
void tock() { _end = ClockT::now(); }
template <class T = DT>
auto duration() const {
gsl_Expects(_end != timep_t{} && "toc before reporting");
return std::chrono::duration_cast<T>(_end - _start);
}
};
Comme Howard Hinnant a souligné, nous utilisons une durée pour rester dans la chrono
et effectuer des opérations comme le calcul de la moyenne ou des comparaisons (par exemple, ici, cela signifie utiliser std::chrono::milliseconds
). Lorsque nous nous contentons de faire IO, nous utilisons la fonction count()
ou des ticks d'une durée (par exemple ici nombre de millisecondes).
2 - Instrumentation
Tout appelable (fonction, objet fonction, lambda, etc.) peut être instrumenté pour l'analyse comparative. Disons que vous avez une fonction F
invocable avec des arguments arg1,arg2
cette technique aboutit à :
cout << "F runtime=" << measure<>::duration(F, arg1, arg2).count() << "ms";
<strong>Demo</strong>
measure
est défini comme suit :
template <class TimeT = std::chrono::milliseconds
class ClockT = std::chrono::steady_clock>
struct measure
{
template<class F, class ...Args>
static auto duration(F&& func, Args&&... args)
{
auto start = ClockT::now();
std::invoke(std::forward<F>(func), std::forward<Args>(args)...);
return std::chrono::duration_cast<TimeT>(ClockT::now()-start);
}
};
Comme mentionné dans (1), l'utilisation de la durée w/o .count()
est plus utile pour les clients qui veulent post-traiter un ensemble de durées avant l'E/S, par exemple la moyenne :
auto avg = (measure<>::duration(func) + measure<>::duration(func)) / 2;
std::cout << "Average run time " << avg.count() << " ms\n";
+ Ce site est la raison pour laquelle l'appel de fonction transféré.
+Le code complet peut être trouvé aquí
+Ma tentative de construire un cadre de référence basé sur le chrono est enregistré aquí
+Vieux Démonstration
10 votes
Je ne comprends pas la question. Bien sûr, les valeurs sont différentes. Le temps a passé entre les deux, donc
time()
renvoie une valeur différente.1 votes
Que voulez-vous dire par "Je ne comprends pas pourquoi les valeurs avant et après sont différentes" ? Vous obtenez l'heure actuelle (en secondes depuis le 1er janvier 1970) à l'aide de la fonction
time(NULL)
... la deuxième fois que vous l'appellerez sera N secondes après la première et donc ... différente (à moins que ce que vous êtes en train de faire ne prenne pas une seconde pour se terminer ... dans ce cas, ce sera la même chose que la première).1 votes
Pouvez-vous nous dire ce que cela imprime, et combien de temps cela prend si vous le chronométrez avec un chronomètre ou une horloge murale (ou un calendrier) ?
4 votes
Désolé, je veux dire que les deux valeurs sont les MÊMES. J'ai mal tapé ma question.
2 votes
Voir ce fil : stackoverflow.com/questions/275004/
0 votes
@hap497 cool, mais qu'est-ce que ça imprime (et combien de temps ça prend si on chronomètre à la main) ?
0 votes
Avez-vous déjà lu ceci open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm
0 votes
Voulez-vous mesurer heure de l'horloge murale (moment de la fin du processus - moment du début du processus), ou voulez-vous mesurer temps CPU consommé ? (Le temps d'horloge murale peut être une fraction du temps CPU avec le multithreading, et le temps CPU peut être une fraction du temps d'horloge murale lorsque votre processus attend sur les E/S). Vous devez utiliser des fonctions différentes pour cela. Pour la dernière fonction, l'approche la plus simple est d'exécuter votre processus sous le contrôle de la fonction de contrôle d'accès.
time
(aucune modification du code source nécessaire) ; cela vous fournira également le temps que le noyau a passé à gérer les E/S du processus.0 votes
Vous pouvez rencontrer les Microsoft Minute .
0 votes
Si facilement est ce qui est le plus important.
time ./MyProgram
(linux uniquement). Référence : levelup.gitconnected.com/ .0 votes
time(NULL)
a un résultat en secondes. Si le programme prend moins d'une seconde, les heures de début et de fin seront les mêmes. Le résultat de timersub est une structure contenant des secondes entières et des microsecondes entières (cf. man7.org/linux/man-pages/man2/settimeofday.2.html ) Vous pouvez donc l'imprimer avecprintf("**time taken = %ld.%06ld\n", diff.tv_sec, diff.tv_usec);
0 votes
Notez que
tv_usec
es microsecondes pas des nanosecondes. Le siteu
est souvent utilisé à la place de (mu minuscule) car il n'est pas disponible en ASCII (non étendu), d'où "usec" plutôt que "s".