时长与时钟
测量时间间隔
时长与时钟 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
为什么使用 <chrono>
<chrono>库为 C++ 提供了以类型安全的方式处理时间的能力。您无需使用原始整数,而是使用强类型的时长和时间点,让编译器捕获单位错误。
- 不再混淆秒和毫秒。
- 单位属于类型系统的一部分。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
seconds s{5};
std::cout << "Duration: " << s.count() << " seconds\n";
return 0;
}什么是时长
std::chrono::duration表示一段时间跨度。它存储时钟周期的计数,以及描述时钟周期长度的比率。标准库提供了常用单位的预定义别名。
hours、minutes、secondsmilliseconds、microseconds、nanoseconds
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
milliseconds ms{1500};
std::cout << ms.count() << " ms\n";
return 0;
}时长字面量
std::chrono_literals命名空间允许您使用5s或200ms这样的后缀书写时长,让代码读起来像普通英语。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono_literals;
auto wait = 3s;
auto blink = 250ms;
std::cout << wait.count() << "s, " << blink.count() << "ms\n";
return 0;
}转换时长
duration_cast可以在不同单位之间进行转换。从更精细的单位转换为更粗略的单位时会截断,因此 1500 ms 会变成 1 s。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
milliseconds ms{1500};
seconds s = duration_cast<seconds>(ms);
std::cout << s.count() << " whole seconds\n";
return 0;
}时长运算
时长支持+、-、*和/。混合使用不同单位时,会自动提升为更精细的公共单位。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto total = minutes{2} + seconds{30};
std::cout << total.count() << " seconds total\n";
return 0;
}浮点时长
转换时可以使用浮点表示来保留小数值,从而避免整数时长的截断。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
milliseconds ms{1500};
duration<double> secs = ms;
std::cout << secs.count() << " seconds\n";
return 0;
}什么是时钟
时钟提供当前时间。标准库提供三种时钟:
system_clock— 挂钟时间steady_clock— 永不倒退,非常适合计时high_resolution_clock— 可用的最精细时钟周期
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto now = steady_clock::now();
std::cout << "Got a time point: " << (now.time_since_epoch().count() > 0) << '\n';
return 0;
}system_clock
system_clock跟踪现实世界的日历时间,并可以转换为time_t以便显示。如果系统时钟经过调整,它可能会发生跳变。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
auto secs = duration_cast<seconds>(tp.time_since_epoch());
std::cout << "Seconds since epoch is positive: " << (secs.count() > 0) << '\n';
return 0;
}steady_clock
steady_clock是单调的:它只会以恒定速率向前移动。测量经过时间时,请始终使用它,不要使用system_clock。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto a = steady_clock::now();
auto b = steady_clock::now();
std::cout << "Monotonic: " << std::boolalpha << (b >= a) << '\n';
return 0;
}时钟分辨率
每个时钟都会以编译时比率的形式公开其period。您也可以在编译时检查时钟是否稳定。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
std::cout << "steady_clock is_steady: " << std::boolalpha << steady_clock::is_steady << '\n';
std::cout << "system_clock is_steady: " << system_clock::is_steady << '\n';
return 0;
}综合运用
组合使用时钟和时长:读取两个时间点,并以您选择的单位计算它们之间的差值。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto start = steady_clock::now();
long sum = 0;
for (int i = 0; i < 1000000; ++i) sum += i;
auto end = steady_clock::now();
auto us = duration_cast<microseconds>(end - start);
std::cout << "Loop took at least 0 us: " << (us.count() >= 0) << '\n';
return 0;
}快速检查
测试您对计时应使用哪种时钟的理解。
回顾
您了解了<chrono>提供的功能:
- 时长——具有类型安全性的时间跨度,支持
5s这样的字面量 - 使用
duration_cast转换单位(会截断整数) - 时钟——
system_clock、steady_clock、high_resolution_clock - 使用
steady_clock测量时间间隔
接下来,您将使用时间点表示时间中的特定时刻。
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 51
- 课程
- 203
常见问题解答
「时长与时钟」课时是免费的吗?
是的 — 「时长与时钟」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「时长与时钟」这节课中我会学到什么?
测量时间间隔 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「时长与时钟」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。