C++ std::chrono时间库是C++标准库提供的一个时间处理库,提供了一个方便、灵活和精确的时间处理工具,用于在程序中进行时间相关的操作和计算。它具有以下重要性和作用:
C++ std::chrono时间库能够帮助准确测量和控制代码的执行时间,处理定时任务,进行时间间隔计算等操作。这里将全面介绍C++ std::chrono时间库的使用,帮助读者理解其核心概念和各种功能,从而在编程中更好地掌握时间的节奏,解放代码从时间束缚中。
目标:
C++ std::chrono命名空间是C++标准库中的一个命名空间,它包含了一组用于处理时间和时间相关操作的类和函数。该命名空间提供了丰富的时间处理功能,旨在方便进行时间计算、测量和控制。
std::chrono命名空间的主要作用和用途:
时间库的基本组成部分包括duration(时间段)、time_point(时间点)和clock(时钟)。它们相互配合,用于表示和处理时间的不同方面。
std::chrono::duration<int, std::duratio<1, 1000>>
表示毫秒级别的时间段。在使用Duration时,可以进行加减、比较和表示等操作。std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>
表示系统时钟下的纳秒级时间点。可以获取当前的时间点、比较不同时间点的顺序,以及对时间点进行格式化等操作。这三个基本组成部分相互配合,使时间库具有了强大的时间处理能力。Duration表示时间段,Time_point表示时间点,而Clock则提供了时钟的基准。通过使用它们,可以对时间进行准确的计算、比较和操作,从而灵活地处理时间相关的任务和逻辑。
Duration(时间段)是时间库中表示时间间隔的类,用于表示两个时间点之间的时间差。
std::chrono::duration<int, std::milli>
。std::chrono::duration<int, std::milli> duration1(500); // 创建一个表示500毫秒的duration对象
std::chrono::duration<double, std::ratio<1, 1000>> duration2 = 2.5; // 创建一个表示2.5毫秒的duration对象
std::chrono::duration<float, std::ratio<1>> duration3 = duration1 + duration2; // 创建一个表示3秒的duration对象
std::chrono::duration<int, std::milli> duration(500);
int milliseconds = duration.count(); // 返回500
std::chrono::duration<int, std::milli> duration1(500);
std::chrono::duration<double, std::nano> duration2(1.5);
std::chrono::duration<int, std::micro> duration3 = duration1 + duration2; // 表示501.5微秒
std::chrono::duration<int, std::milli> duration4 = duration1 * 2; // 表示1000毫秒
std::chrono::duration<double, std::milli> duration5 = duration2 / 2; // 表示0.75毫秒
std::chrono::duration<int, std::milli> duration1(500);
std::chrono::duration<double, std::nano> duration2(1.5);
bool result = duration1 > duration2; // 返回true,因为500毫秒大于1.5纳秒
std::chrono::nanoseconds
std::chrono::microseconds
std::chrono::milliseconds
std::chrono::seconds
std::chrono::minutes
std::chrono::hours
这些单位可以提供不同精度的时间间隔表示。
例如,可以选择使用以下精度选项:
std::chrono::duration<int, TimeUnit>
std::chrono::duration<long, TimeUnit>
std::chrono::duration<float, TimeUnit>
std::chrono::duration<double, TimeUnit>
例如,如果需要表示毫秒级别的时间间隔,可以选择std::chrono::duration<int, std::milli>
,它使用整数类型表示毫秒。
using namespace std::chrono;
// 表示10毫秒的duration,使用整数类型精度
duration<int, std::milli> duration1(10);
// 表示5秒的duration,使用长整数类型精度
duration<long, std::seconds> duration2(5);
// 表示2.5秒的duration,使用浮点类型精度
duration<float, std::seconds> duration3(2.5);
// 表示1分钟的duration,使用双精度类型精度
duration<double, std::minutes> duration4(1);
// 可以使用auto关键字自动推导出duration的类型
auto duration5 = duration<int, std::micro>(100);
以下是一些使用Duration的具体示例,涵盖时间计算和延时操作:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 创建两个时间点
steady_clock::time_point start = steady_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作
steady_clock::time_point end = steady_clock::now();
// 计算时间间隔
duration<double> duration = duration_cast<duration<double>>(end - start);
// 输出时间间隔
std::cout << "Elapsed time: " << duration.count() << " seconds\n";
return 0;
}
上述示例中,使用steady_clock来获取当前时间点,并通过duration_cast
将时间间隔转换为秒。最后,使用count()
函数获取时间间隔的值并进行输出。
#include <iostream>
#include <chrono>
#include <thread>
int main() {
using namespace std::chrono;
std::cout << "Start" << std::endl;
// 进行延时操作,暂停程序执行
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "End" << std::endl;
return 0;
}
使用this_thread::sleep_for
函数来进行延时操作,程序会暂停执行2秒钟,然后继续往下执行。
time_point(时间点)是std::chrono库中用于表示具体时间的类型。它表示了某个具体时刻的时间点,可以用于比较不同时间点的时间先后或时间间隔的计算。
time_point由两部分组成:时钟(Clock)和表示时间的持续时间(Duration)。
使用方法: 要创建一个time_point对象,需要指定时钟类型和持续时间。可以使用当前的时钟来获取当前时间点,也可以根据需求指定一个特定的时间点。示例:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 使用系统时钟获取当前时间点
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
// 创建一个表示特定时间点的time_point
std::chrono::system_clock::time_point specific_time =
std::chrono::system_clock::time_point(std::chrono::seconds(1625100000));
// 比较两个时间点的先后
if (now > specific_time) {
std::cout << "The current time is later than the specific time.\n";
} else {
std::cout << "The current time is earlier than the specific time.\n";
}
// 计算时间间隔
std::chrono::duration<double> duration = now - specific_time;
std::cout << "The duration between the two time points is: " << duration.count() << " seconds.\n";
return 0;
}
通过std::chrono库中的system_clock获取了当前时间点,并通过手动指定一个特定的时间点。然后,可以比较这两个时间点的先后,并计算它们之间的时间间隔。
time_point表示一个具体的时间点,可以视为时间的参考点或标记。它由两个组成部分构成:时钟(Clock)和持续时间(Duration)。时钟指定了时间的基准和精度,而持续时间表示两个时间点之间的时间间隔。
duration表示一个时间长度或时间间隔,它可以是纳秒、微秒、毫秒、秒、分钟、小时等不同的时间单位。duration模板类的参数指定了时间长度的数值类型和时间单位。持续时间的正负值决定了时间间隔是向前还是向后。
time_point和duration之间的关系:
下面是一个使用time_point和duration的示例,展示了它们之间的关系:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 获取当前时间点
system_clock::time_point start = system_clock::now();
// 进行一些耗时操作
std::this_thread::sleep_for(std::chrono::seconds(2));
// 获取后续的时间点
system_clock::time_point end = system_clock::now();
// 计算时间间隔
duration<double> duration = duration_cast<duration<double>>(end - start);
// 输出时间间隔
std::cout << "Elapsed time: " << duration.count() << " seconds\n";
return 0;
}
说明:使用system_clock获取了开始和结束的时间点,然后通过减法操作计算时间间隔duration。最后,使用duration的count()方法获取时间间隔的值,并输出结果。这个示例演示了如何结合使用time_point和duration来计算时间间隔。
演示了如何创建、比较和操作time_point对象:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 创建一个time_point对象 - 使用系统时钟获取当前时间点
system_clock::time_point now = system_clock::now();
// 创建一个time_point对象 - 手动指定一个特定时间点
system_clock::time_point specific_time = system_clock::time_point(seconds(1625100000));
// 比较两个time_point对象的先后
if (now > specific_time) {
std::cout << "The current time is later than the specific time.\n";
} else {
std::cout << "The current time is earlier than the specific time.\n";
}
// 操作time_point对象,计算时间间隔
system_clock::time_point future = now + hours(48);
duration<double> duration = duration_cast<duration<double>>(future - now);
std::cout << "The duration between now and future is: " << duration.count() << " seconds.\n";
return 0;
}
说明:使用system_clock获取了当前时间点,并通过手动指定一个特定的时间点创建了另一个time_point对象。然后,比较这两个time_point对象的先后关系,并输出结果。接下来,操作time_point对象,通过将一个duration(48小时)加到当前时间点上,得到一个未来的时间点。最后,我们计算了当前时间点和未来时间点之间的时间间隔,并输出结果。
注意:在计算时间间隔时,使用了duration_cast将时间间隔转换为所需的duration类型(在这里是double类型)。
在std::chrono库中,存在三种不同类型的时钟:system_clock、steady_clock和high_resolution_clock。它们都用于表示时间点和测量时间间隔,但在实际应用中会有一些区别。
使用不同类型的时钟的示例:
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
// 使用system_clock获取当前时间
system_clock::time_point system_now = system_clock::now();
// 使用steady_clock获取开始时间
steady_clock::time_point steady_start = steady_clock::now();
// 一些操作...
// 使用steady_clock获取结束时间
steady_clock::time_point steady_end = steady_clock::now();
// 使用high_resolution_clock获取开始时间
high_resolution_clock::time_point high_res_start = high_resolution_clock::now();
// 一些操作...
// 使用high_resolution_clock获取结束时间
high_resolution_clock::time_point high_res_end = high_resolution_clock::now();
// 输出时间间隔
duration<double> steady_duration = duration_cast<duration<double>>(steady_end - steady_start);
duration<double> high_res_duration = duration_cast<duration<double>>(high_res_end - high_res_start);
std::cout << "Steady duration: " << steady_duration.count() << " seconds.\n";
std::cout << "High resolution duration: " << high_res_duration.count() << " seconds.\n";
return 0;
}
说明:使用system_clock获取了当前时间,使用steady_clock和high_resolution_clock获取了开始和结束时间。然后,通过减法操作计算了时间间隔,并使用duration_cast将时间间隔转换为double类型的秒数。最后,输出了steady_clock和high_resolution_clock的时间间隔。
不同类型的时钟(system_clock、steady_clock和high_resolution_clock)具有不同的特点和适用场景
注意:不同的平台可能对这些时钟的实现有所不同,最小时间单位也可能有所不同。可以使用duration_cast
将时间间隔转换为所需的时间单位(例如秒、毫秒、纳秒等)。
如果需要表示当前实时时间、进行日常时间计算和显示,可以使用system_clock。而如果需要测量时间间隔、计算算法的执行时间等,可以使用steady_clock。如果需要更高的时间精度,可以使用high_resolution_clock。
#include <iostream>
#include <chrono>
#include <thread>
int main() {
while (true) {
std::cout << "Hello, World!" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
#include <iostream>
#include <chrono>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
auto start = std::chrono::steady_clock::now();
std::sort(nums.begin(), nums.end());
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Sorting took " << diff.count() << " seconds." << std::endl;
return 0;
}
#include <iostream>
#include <chrono>
int main() {
auto now = std::chrono::system_clock::now();
std::time_t time = std::chrono::system_clock::to_time_t(now);
std::cout << "Current time: " << std::ctime(&time) << std::endl;
return 0;
}
#include <iostream>
#include <chrono>
#include <iomanip>
int main() {
auto now = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::cout << "Current time: " << std::put_time(std::localtime(&t), "%c") << std::endl;
return 0;
}
说明:将当前时间格式化为日期和时间的字符串,并以本地时间格式(“%c”)进行输出。
C++的std::chrono时间库提供了处理时间相关操作的功能。 核心概念:
使用方法:
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::chrono::duration<double> diff = end - start;
double seconds = diff.count();
std::this_thread::sleep_for(std::chrono::seconds(1));
std::time_t time = std::chrono::system_clock::to_time_t(now);
std::cout << "Current time: " << std::ctime(&time) << std::endl;
进一步学习和参考C++ std::chrono时间库的推荐资源:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。