使用
<chrono>
库的好处是可以以不同的精度测量时间,包括纳秒、微秒、毫秒和秒。通过计算两个时间点之间的时间间隔,可以精确地测量代码执行的时间。
通过一个具体实例来逐步讲解时间库chrono的使用,实例如下:
// 开始计时
auto startTime = std::chrono::steady_clock::now();
//自己定义的检查答案的函数,可忽略
checkAnswers(problems);
// 停止计时
auto endTime = std::chrono::steady_clock::now();
// 计算答题时间
std::chrono::duration<double> elapsedSeconds = endTime - startTime;
int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60);
int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60;
std::cout << "Time taken: " << elapsedMinutes << " minutes " << elapsedSecondsRemainder << " seconds" << std::endl;
逐条语句讲解:
开始或者停止计时的代码
// 开始计时
auto startTime = std::chrono::steady_clock::now();
// 停止计时
auto endTime = std::chrono::steady_clock::now();
这段代码使用了C++标准库中的 <chrono>
头文件中的时间库,用于获取开始计时时间并将其存储在变量 startTime
中,获取停止计时时间并将其存储在变量 endTime
中。
下面是对该代码的解释:
-
std::chrono::steady_clock
:steady_clock
是一个表示稳定、递增的时钟,用于测量时间间隔。它提供了一个相对稳定的时间基准,适用于测量较小时间间隔。 -
std::chrono::steady_clock::now()
:now()
是steady_clock
类的成员函数,用于获取当前的时间点。 -
auto startTime = std::chrono::steady_clock::now();
:这行代码使用auto
关键字自动推导变量类型,将当前时间点的值赋给变量startTime
。由于std::chrono::steady_clock::now()
返回的是一个时间点对象,编译器通过自动类型推导将其分配给startTime
变量。
计算答题时间的代码
// 计算答题时间
std::chrono::duration<double> elapsedSeconds = endTime - startTime;
int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60);
int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60;
这段代码用于计算答题时间,并将其分解为分钟和秒。
std::chrono::duration<double> elapsedSeconds = endTime - startTime;
:
这一行代码计算endTime
和startTime
之间的时间差,并将结果存储在elapsedSeconds
变量中。elapsedSeconds
是一个std::chrono::duration
类型的对象,用于表示持续的时间。通过将endTime
减去startTime
,我们得到了这段时间的持续时间。
注:std::chrono::duration
是 C++ 标准库中用于表示时间持续的类模板。std::chrono::duration
提供了一系列成员函数和运算符,用于对时间持续进行操作和计算。一些常用的成员函数和运算符包括:
count()
:返回持续时间的内部表示值(类型为 Rep)。operator+、operator-
:用于对两个持续时间进行加法和减法运算。operator*、operator/
:用于将持续时间乘以或除以一个标量值。operator==、operator!=、operator<、operator>
:用于比较两个持续时间的大小关系。
int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60);
:
这一行代码将持续时间转换为以分钟为单位的整数值。elapsedSeconds.count()
返回持续时间的秒数,除以 60 可以得到分钟数。使用static_cast<int>
进行强制类型转换,将浮点数结果转换为整数。
注:static_cast
是 C++ 中的一种类型转换操作符,用于进行静态类型转换(static_cast)。
静态类型转换是一种在编译时进行的类型转换,它允许将一个类型转换为另一个相关类型,前提是这两个类型之间存在某种类型转换的关系。
static_cast 可以用于以下几种转换:
-
隐式类型转换:static_cast 可以将一种算术类型转换为另一种算术类型,如将 int 转换为 double、将 float 转换为 int 等。
-
类层次转换:static_cast 可以在类层次结构中进行向上转型(upcast)和向下转型(downcast),但在向下转型时需要注意安全性,因为 static_cast 不提供运行时类型检查。如果向下转型是不安全的,应该使用 dynamic_cast 进行动态类型转换。
-
指针类型转换:static_cast 可以在指针类型之间进行转换,包括将派生类指针转换为基类指针(向上转型)和将基类指针转换为派生类指针(向下转型)。在指针转换时,编译器不会进行运行时类型检查,因此需要确保转换是安全的。
-
引用类型转换:static_cast 可以在引用类型之间进行转换,类似于指针类型转换。转换时需要注意类型的兼容性和安全性。
int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60;
:
这一行代码计算以秒为单位的剩余时间。elapsedSeconds.count()
返回持续时间的秒数,使用static_cast<int>
将其转换为整数。然后,通过取模运算符%
将其对 60 取余,得到不足一分钟的剩余秒数。