C++ <chrono> 时间库

C++ 的时间库比 C的”time.h”库提供更多的时间处理机制,现在依次举一些例子

对于时间来说,计算机如何表示?计算的存储结构是什么样的?

以一个时间轴的模型,我们可以用一个整数来表示一个时间,C的标准库中使用 time_t 来表示

我们还可以从时间的形式上来进行抽象,比如时分秒年月日,C的标准库中使用 struct tm 来表示

最后我们还可以以字符串的形式来表示时间,此种方式不利于时间的计算,但是利于时间的字符显示

C++的库我相信也是使用如上的表示方法,但是对于时间的计算、时间的获取以及时间的精度会有一个质的提高

在这里还有必要提一下另一种时间的表示法,这种表示法是时间表示的物理模式,一个时钟频率h,一个时钟跳跃次数n, 时间t=n/h,我们也可以使用一个double 类型的数据来表示时间,或者使用 频率 次数 的结构来表示时间

/*
 * 计算时间间隔 End - Start
 */
#include <chrono>
#include <stdio.h>

int main() {
    using namespace std::chrono;

    steady_clock::time_point t1 = steady_clock::now();  // Get current time

    puts("printing out 100000 starts...");
    for (int i=0;i <100000; ++i) putchar('*');
    putchar('\n');

    steady_clock::time_point t2 = steady_clock::now();

    duration<double> time_span = duration_cast<duration<double> >(t2 - t1);

    printf("%.9lfseconds\n", time_span.count());

    return 0;
}
/*
 * 得到当前时间的方法
 */
#include <chrono>
#include <stdio.h>

int main() {
    using namespace std::chrono;
    time_t t;

    // 1. 使用C标准库函数 time
    time(&t);
    puts(ctime(&t));

    // 2. 使用systime_clock::now
    system_clock::time_point tp = system_clock::now();
    t = system_clock::to_time_t(tp);
    puts(ctime(&t));
}
/*
 * 时间加法 和 时间减法
 */

#include <chrono>
#include <stdio.h>

int main() {
    using namespace std::chrono;

    system_clock::time_point tp = system_clock::now();
    system_clock::time_point tp2;
    hours day(24);  // 1 day; hours:  typedef duration<int, ratio<3600>>    hours;
    tp2 = tp + day;

    time_t t;
    t = system_clock::to_time_t(tp);
    puts(ctime(&t));
    t = system_clock::to_time_t(tp2);
    puts(ctime(&t));

    return 0;
}
/*
 * 时间加法 和 时间减法
 */

#include <chrono>
#include <stdio.h>

int main() {
    using namespace std::chrono;
    system_clock::time_point t1 = system_clock::now();

    for (int i=0; i<1000000; ++i) putchar('*');
    putchar('\n');

    system_clock::time_point t2 = system_clock::now();

    nanoseconds d = t2 - t1;
    printf("%ld nan\n", d.count());
    duration<double> d2 = duration_cast<duration<double> >(t2-t1);
    printf("%.9lf sec\n", d2.count());

    return 0;
}

C++ 对时间库的改进是我感动欣慰的一点,尤其是对时间精度的调整(虽然表示怀疑,精度是否准确,这里也没有进行测试)
这个库整体来说还是比较容易理解的,但是steady_clock 和 system_clock 有什么样的不同,我还是不能理解

时间对我目前来说有三个用处:

  1. 测试性能:使用一个开始时间,一个结束时间,用结束时间减去开始时间来计算程序运行耗费的时间(这里我更倾向使用steady_clock)
  2. 记录日志:用一个时间记录某个事件的开始时间
  3. 预测计算:使用一段时间的值,来预测计算未来某个时间的值

针对时间的算法主要考虑两点:时间点和时间段。这是时间算法的核心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值