8 Haziran 2020 Pazartesi

std::chrono::duration Olan Hazır Sınıfı

Giriş
duration olarak hazır gelen bazı sınıflar mevcut. Bunlar şöyle. İsimlerin hep çoğul. Açıklaması şöyle
All "predefined" chrono::duration types are plural
İsimler şöyle. 9 tane var
nanoseconds
microseconds
milliseconds
seconds
minutes
hours
days
months
years
Kod olarak şöyle
namespace std {
namespace chrono {
   typedef duration<signed int-type >= 64 bits,nano>        nanoseconds;
   typedef duration<signed int-type >= 55 bits,micro>       microseconds;
   typedef duration<signed int-type >= 45 bits,milli>       milliseconds;
   typedef duration<signed int-type >= 35 bits>             seconds;
   typedef duration<signed int-type >= 29 bits,ratio<60>>   minutes;
   typedef duration<signed int-type >= 23 bits,ratio<3600>> hours;
   }
}
days
days yazısına taşıdım.

months
months yazısına taşıdım.

years
years yazısına taşıdım.

Hazır Sınıflar Arasında Çevrim
Bu sınıflar arasında büyükten küçüğe otomatik çevrim olabilir. Örneğin mikrosaniye cinsinden parametre alan bir metoda milisaniye cinsinden bir parametre geçilebilir. Ancak tam tersi derlenmez.

Hazır Sınıflar ve Integral Değer
Hazır sınıfların aralarındaki fark süreyi saklamak için nasıl bir integral tip kullandıkları. Integral tipin neden farklı olduğu şöyle açıklanmış.
In Boost.DateTime, hours does not have the same representation as nanoseconds. The former is usually represented with a long whereas a long long is required for the latter. The reason for this is simply range. You don't need many hours to cover an extremely large range of time. But this isn't true of nanoseconds. Being able to reduce the sizeof overhead for some units when possible, can be a significant performance advantage.
Eğer istersek hazır sınıfa farklı bir integral verebiliriz. Küsuratlı olarak milisaniye görmek istersek şöyle yaparız
std::chrono::system_clock::time_point a = std::chrono::system_clock::now();
...
std::chrono::system_clock::time_point b = std::chrono::system_clock::now();
std::chrono::duration<double, std::milli> work_time = b - a;
Şöyle yazdırırız.
printf("Time: %f \n", work_time.count());
Çıktı olarak şunu alırız.
Time: 199.057206 
Time: 199.053581 
Time: 199.064718 
Time: 199.053515 
Time: 199.053307 
Time: 199.053415 
Time: 199.053164 
Time: 199.053511 
Time: 199.053280 
Time: 199.053283   
duration sınıfının kendisi ise ratio<1> ile tanımlı. Yani birimi olmayan bir sayaç gibi. Eğer istersek double saklayan bir duration bile tanımlayabiliriz.
std::chrono::duration<double>(timeToSleep)
Kendi Tanımım
Şöyle yaparız. Nanosecond değeri 100 ile çarparak long long tipinde saklar.
using Ticks = std::chrono::duration<long long,
  std::ratio_multiply<std::chrono::nanoseconds::period, std::ratio<100>>>;

Hiç yorum yok:

Yorum Gönder