25 Mayıs 2016 Çarşamba

chrono sınıfları

C++11 chrono
Chrono içinde saat, süre, zaman noktası gibi kavramlar kullanılmış. Chrono için koda şu include eklenir.
#include <chrono>
1. Süre - Duration
chrono duration yazısına taşıdım.

2. Zaman Noktası - Time Point
Zaman noktaları saatin tipinden tanımlanır. Saatin epoch içindir. Süre ise epoch'tan beri geçen tick sayısı içindir.

A timepoint is defined as combination of a duration and a beginning of time (the so-calledepoch).
In other words, timepoint is defined as a duration before or after an epoch, which is defined by a clock

chrono::high_resolution_clock::time_point sınıfı
zaman değerini saklar
typedef std::chrono::high_resolution_clock my_clock;

my_clock::time_point start = my_clock::now();

3. Saatler
3 tane temel saat var. Bunlar high_resolution_clock, system_clock ve steady clock. Saatin sunduğu en önemli metod now(). Bunun dışında pek te önemli bir şey sunmuyor.

3.1 chrono::system_clock sınıfı
chrono::system_clock sınıfı yazısına taşıdım.

3.2 chrono::high_resolution_clock sınıfı

Sınıfın tanımında "represents the clock with the smallest tick period provided by the implementation" yazıyor.

high_resolution_clock sistemdeki en hassas saate alias olarak tanımlanır. En hassas saat system_clock veya steady_clock olabilir. En hassas saat system_clock ise durum vahimdir :)

Windows için notlar:
VS2012'de  high_resolution_clock system_clock ile aynı. Hatta sadece typdef olarak tanımlı.

Windows'ta en küçük çözünürlük 100 nanosaniye. Ancak çoğunlukla 100 nanosaniyede bir güncellenmiyor.

Çözünürlük şöyle bulunur.
cout << "resolution (nano) = " << (double) high_resolution_clock::period::num
        / high_resolution_clock::period::den * 1000 * 1000 * 1000 << endl;
Burada high_resolution_clock::period::den her saniyedeki tick sayısını verir. Her tick'in arasını saniye olarak bulup 1 milyar ile çarparak nanosaniyeye çeviriyoruz. Çıktı olarak şunu alırız.
resolution (nano) = 100
now metodu
Bir time_point  döndürür.
typedef std::chrono::high_resolution_clock my_clock;

my_clock::time_point start = my_clock::now();
3.3 chrono::steady_clock sınıfı
std::chrono::steady_clock Sınıfı yazısına taşıdım.

Hepsini Kullanmak
ScopedTimer örneği
#include <chrono>
#include <iostream>

using std::cout;
using std::chrono::high_resolution_clock;
using std::chrono::milliseconds;
using std::endl;

class ScopedTimer {
public:
    ScopedTimer(const string& name)
    : name_(name), start_time_(high_resolution_clock::now()) {}

    ~ScopedTimer() {
        cout << name_ << " took "
        << std::chrono::duration_cast<milliseconds>(
                         high_resolution_clock::now() - start_time_).count()
        << " milliseconds" << endl;
    }

private:
    const string name_;
    const high_resolution_clock::time_point start_time_;
};






Hiç yorum yok:

Yorum Gönder