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 有什么样的不同,我还是不能理解
时间对我目前来说有三个用处:
- 测试性能:使用一个开始时间,一个结束时间,用结束时间减去开始时间来计算程序运行耗费的时间(这里我更倾向使用steady_clock)
- 记录日志:用一个时间记录某个事件的开始时间
- 预测计算:使用一段时间的值,来预测计算未来某个时间的值
针对时间的算法主要考虑两点:时间点和时间段。这是时间算法的核心。