Die Zeitdauer

Eine Zeitdauer ist die Differenz zwischen zwei Zeitpunkten. Sie wird in der Anzahl von Zeittakten angegeben.

Die Zeitdauer

Die Zeitdauer ist ein Klassen-Template. std::chrono::duration besteht aus dem Typ Rep seiner Ticks und der Ticklänge Period.

template<
    class Rep,
    class Period = std::ratio<1>
> class duration;

 

Die Ticklänge ist per Default std::ratio<1> std::ratio<1> entspricht einer Sekunde und lässt sich auch als std::ratio<1,1> schreiben. Somit ist schnell klar. std::ratio<60> entspricht einer Minute und std::ratio<1,1000> einer Millisekunde. Ist Rep eine Fließkommazahl, lassen sich auch Bruchteile des Zeittakts darstellen

Die wichtigsten Zeitdauern hat der C++11 Standard bereits vordefiniert.

typedef duration<signed int, nano> nanoseconds;
typedef duration<signed int, micro> microseconds;
typedef duration<signed int, milli> milliseconds;
typedef duration<signed int> seconds;
typedef duration<signed int, ratio< 60>> minutes;
typedef duration<signed int, ratio<3600>> hours;

 

Mit Hilfe der Typaliase lässt es sich in verschiedenen Zeitdauern bestimmen, wiewiel Zeit seit der UNIX-Epoche (1.1.1970) vergangen ist. Der Einfachheit halber ignoriere ich Schaltjahre und nehme an, das ein Jahr aus 365 Tagen besteht.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// timeSinceEpoch.cpp

#include <chrono>
#include <iostream>

int main(){

  std::cout << std::fixed << std::endl;
  
  std::cout << "Time since 1.1.1970:\n" << std::endl;

  auto timeNow= std::chrono::system_clock::now();
  auto duration= timeNow.time_since_epoch();
  std::cout << duration.count() << " nanoseconds " << std::endl;

  typedef std::chrono::duration<long double,std::ratio<1,1000000>> MyMicroSecondTick;
  MyMicroSecondTick micro(duration);
  std::cout << micro.count() << " microseconds" << std::endl;
  
  typedef std::chrono::duration<long double,std::ratio<1,1000>> MyMilliSecondTick;
  MyMilliSecondTick milli(duration);
  std::cout << milli.count() << " milliseconds" << std::endl;
  
  typedef std::chrono::duration<long double> MySecondTick;
  MySecondTick sec(duration);
  std::cout << sec.count() << " seconds " << std::endl;
  
  typedef std::chrono::duration<double, std::ratio<60>> MyMinuteTick;
  MyMinuteTick myMinute(duration);
  std::cout << myMinute.count() << " minutes" << std::endl;

  typedef std::chrono::duration<double, std::ratio<60*60>> MyHourTick;
  MyHourTick myHour(duration);
  std::cout << myHour.count() << " hours" << std::endl;
  
  typedef std::chrono::duration<double, std::ratio<60*60*24*365>> MyYearTick;
  MyYearTick myYear(duration);
  std::cout << myYear.count() << " years" << std::endl;

  typedef std::chrono::duration<double, std::ratio<60*45>> MyLessonTick;
  MyLessonTick myLesson(duration);
  std::cout << myLesson.count() << " lessons" << std::endl;

  std::cout << std::endl;

}

 

Neben den typischen Zeitdauern wie Mikrosekunden (Zeile 16), Millisekunden (Zeile 20), Sekunden (Zeile 24), Minuten (Zeile 28), Stunden (Zeile 32) und Jahren (Zeile 36) habe ich auch eine Schulstunde in Zeile 40 definiert.

 timeSinceEpoch

Besonders schön lässt sich mit Zeitdauern rechnen.

Rechnen mit Zeitdauern

Die Zeitdauern unterstützen alle Grundrechenarten. Das bedeutet im Falle der Multiplikation oder Division, dass eine Zeitdauer mit einer Zahl verrechnet werden kann. Das Ergebnis ist eine Zeitdauer. Darüber hinaus lassen sich Zeitdauern vergleichen. Explizit möchte ich dabei betonen, dass sowohl die Grundrechenarten als auch die Vergleiche die Einheit der Zeitdauer respektieren.

Mit C++14 wird das Rechnen mit Zeitdauern noch komfortabler, denn C++14 bringt einen Satz an Zeitliteralen mit. 

builtInLiterale

Wie lange benötigt mein 16-jähriger Sohn täglich für seine Schule auf dem Gymnasium. Diese Frage beantwortet ich in dem Beispiel und stelle das Ergebnis in verschiedenen Zeitdauern dar.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// schoolDay.cpp

#include <iostream>
#include <chrono>

using namespace std::literals::chrono_literals;

int main(){

  std::cout << std::endl;

  constexpr auto schoolHour= 45min;

  constexpr auto shortBreak= 300s;
  constexpr auto longBreak= 0.25h;

  constexpr auto schoolWay= 15min;
  constexpr auto homework= 2h;

  constexpr auto schoolDayInSeconds= 2*schoolWay + 6 * schoolHour + 4 * shortBreak + longBreak + homework;

  std::cout << "School day in seconds: " << schoolDayInSeconds.count() << std::endl;

  std::chrono::duration<double,std::ratio<3600>> schoolDayInHours = schoolDayInSeconds;
  std::chrono::duration<double,std::ratio<60>> schoolDayInMinutes = schoolDayInSeconds;
  std::chrono::duration<double,std::ratio<1,1000>> schoolDayInMilliseconds= schoolDayInSeconds;

  std::cout << "School day in hours: " << schoolDayInHours.count() << std::endl;
  std::cout << "School day in minutes: " << schoolDayInMinutes.count() << std::endl;
  std::cout << "School day in milliseconds: " << schoolDayInMilliseconds.count() << std::endl;

  std::cout << std::endl;

}

 

Die Zeitliterale sind konstante Ausdrücke. Daher lassen sich alle Zeitdauern zur Compilezeit anfordern. Dies sind die Zeitdauern für eine Schulstunde (Zeile 12), für eine kurze Pause (Zeile 14), für eine lange Pause (Zeile 15), für den Weg zur Schule (Zeile 17) und die Hausaufgaben (Zeile 18). Das Ergebnis der Berechnung schoolDaysInSeconds (Zeile 20) steht damit zur Compilezeit zur Verfügung.

schoolDay

Die Belastung meines Sohnes hält sich in Grenzen. Sein Schultag entspricht ungefähr einem 8-stündigen Arbeitstag. 

Wie geht's weiter?

Die Genauigkeit des Zeittakts wird durch den Zeitgeber bestimmt. In C++ stehen mit std::chrono::system_clock, std::chrono::steady_clock und std::chrono::high_resolution_clock gleich drei Zeitgeber zur Verfügung. Im nächsten Artikel beschäftige ich mich genauer mit diesen.

 

 

 

 

 

 

 

title page smalltitle page small Go to Leanpub/cpplibrary "What every professional C++ programmer should know about the C++ standard library".   Hole dir dein E-Book. Unterstütze meinen Blog.

 

Mentoring

Stay Informed about my Mentoring

 

Rezensionen

Tutorial

Besucher

Heute 201

Gestern 1599

Woche 5803

Monat 21745

Insgesamt 3320657

Aktuell sind 28 Gäste und keine Mitglieder online

Kubik-Rubik Joomla! Extensions

Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare