C++ Academy · 课时

时长与时钟

测量时间间隔

第 1 / 4 课13 个步骤

时长与时钟 是 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、seconds
  • milliseconds、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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 时长与时钟
  2. 时间点
  3. 测量代码性能
  4. 日历与时区
← 返回 C++ Academy