c++ system calls chrono

本文介绍了C++中的系统服务,包括时间函数、线程操作、内存管理、文件I/O和网络功能,以及chrono库在时间处理(计时器、时间戳和日期计算)中的应用。同时讲解了steady_clock和high_resolution_clock的区别。
摘要由CSDN通过智能技术生成

C++的系统编程:

可以称之为系统服务(system services)。

系统服务包括与操作系统、硬件、网络等底层资源交互的函数,旨在提供对底层资源的访问和管理,保证应用程序能够正常运行。

系统服务一般包括以下内容:

1. 时间函数:可以获取系统时间、计算时间差、格式化时间等。

2. 线程函数:可以获取当前线程id、线程名称、创建和销毁线程等。

3. 内存管理函数:可以获取当前进程的内存使用情况、分配和释放内存等。

4. 文件和I/O函数:可以读写文件、创建和删除文件、设置文件属性等。

5. 网络函数:可以管理网络连接、套接字、协议等。

上述函数都是C++系统服务中常用的函数,它们提供了对操作系统底层资源的访问和管理,是系统编程所必需的。

如果需要归纳到一类,可以称为系统调用(system calls),表示通过调用系统服务来访问和管理底层资源,

使应用程序能够与操作系统进行交互。

C++中的chrono是时间库,用于实现时间相关的功能,例如计时器、执行时间、日期等。

// C++中可以使用std::chrono来进行时间的操作,其中一个常用的类是std::chrono::system_clock。
// 下面是一个简单的示例程序,用于获取和打印当前时间:
#include <iostream>
#include <chrono>
#include <ctime>

using namespace std;

int main()
{
    // 获取当前时间点
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    // 转换为time_t类型
    std::time_t nowTime = std::chrono::system_clock::to_time_t(now);
    // 输出当前时间
    std::cout << "current time : " << std::ctime(&nowTime);

    return 0;
}

// 1. 计时器
// 计时器场景是应用中常见的一种场景,比如需要统计代码执行时间的情况。下面的代码实现了一个简单的计时器。
#include <iostream>
#include <chrono>
#include <thread>

int main()
{
    // 获取任务开始的时间点
    auto start = std::chrono::high_resolution_clock::now();
    // 模拟程序运行一段时间
    std::this_thread::sleep_for(std::chrono::seconds(2));
    // 获取任务结束的时间点
    auto stop = std::chrono::high_resolution_clock::now();
    // 获取两个时间点之间的时间差。最后输出了这个时间差,就可以实现一个简单的计时器了。
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
    std::cout << "耗时 : " << duration.count() << " us" << std::endl;

    return 0;
}

// chrono可以获取epoch(从1971.01.01,0点开始的时间戳)
#include <iostream>
#include <chrono>

using namespace std;

int main()
{
    // `std::chrono::system_clock::now()` 表示获取当前系统时间,返回的是时间点类型 variable,精确到纳秒级别。
    // `time_since_epoch()` 得到该时间点与 EPOCH (即 1970 年 1 月 1 日 00:00:00 UTC)之间的时间持续长度,单位是纳秒,变量类型为 `std::chrono::duration`。
    // 通过 `std::chrono::duration_cast<chrono::milliseconds>` 可以把持续时间长度转换为毫秒数,这里得到的是一个整数变量 `ms`。
    // `std::chrono::duration_cast` 是一种时间类型的强制转换,可将高精度的时间类型转换为低精度的时间类型。
    // 在 C++ 语言当中,强制类型转换包括隐式类型转换和显式类型转换,
    // 对于 `std::chrono` 时间库类型的转换,我们一般使用显式类型转换,并且使用 `std::chrono::duration_cast` 进行精度转换。
    auto ms = std::chrono::duration_cast<chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch());
    std::cout << "current time " << ms.count() << " ms" << std::endl;

    return 0;
}

// 2. 计算程序执行时间
// 在很多编写性能相关的程序时,我们需要精确地计算程序的执行时间,以方便优化或评估程序的性能。

#include <iostream>
#include <chrono>

int main()
{
    // 获取任务开始执行的时间戳
    auto start = std::chrono::steady_clock::now();
    // 执行任务
    std::cout << "hello world!" << std::endl;
    // 获取任务执行结束时间戳
    auto stop = std::chrono::steady_clock::now();
    // 求差并输出任务执行时间,转换成us
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
    std::cout << "任务执行时间: " << duration.count() << " us" << std::endl;

    return 0;
}

// 3. 时间日期计算
// 处理时间日期计算是应用开发中常见的操作。例如,需要计算两个时间点之间的天数,或者日期加减等操作。
// 下面的代码演示了如何计算两个时间点之间的天数差:
// `std::mktime(&timeinfo)`将时间结构体转换为时间戳,然后使用`std::chrono::system_clock::from_time_t()`将时间戳转换为时间点类型,并最后使用持续时长相减求得天数。
#include <iostream>
#include <chrono>
#include <ctime>


int main()
{
    std::tm timeinfo1{}, timeinfo2{};
    timeinfo1.tm_year = 2022 - 1900;
    timeinfo1.tm_mon = 10; // 11月
    timeinfo1.tm_mday = 1;

    timeinfo2.tm_year = 2021 - 1900;
    timeinfo2.tm_mon = 10; // 11月
    timeinfo2.tm_mday = 1;

    auto tp1 = std::chrono::system_clock::from_time_t(std::mktime(&timeinfo1));
    auto tp2 = std::chrono::system_clock::from_time_t(std::mktime(&timeinfo2));

    auto days = std::chrono::duration_cast<std::chrono::duration<int, std::ratio<86400>>>(tp1 - tp2);

    std::cout << "2021年11月1日到2022年11月1日相差 " << days.count() << " 天." << std::endl;
    return 0;
}
// 通过chrono获取当前日期
// 可以使用 C++ STL 中的 `<chrono>` 时间库的 `std::chrono::system_clock` 类和 `std::chrono::time_point` 类进行操作。
// 具体步骤如下:

// 1. 调用 `std::chrono::system_clock::now()` 获取当前精确的时钟时间点。
// 2. 将系统时钟的当前时间点转换为 `std::chrono::time_t` 类型,表示自 1970 年 1 月 1 日以来经过的秒数,可以用 `std::chrono::system_clock::to_time_t` 函数实现。
// 3. 将 `std::chrono::time_t` 类型转换成当前的本地日历时间,可以用标准库中的 `std::localtime` 函数实现,该函数返回的是一个 `struct tm` 结构体。
// 4. 从 `struct tm` 中提取对应的年、月、日信息即可。

#include <iostream>
#include <chrono>
#include <ctime>


int main()
{
    // 获取当前系统时钟的时间点
    auto now = std::chrono::system_clock::now();
    // 将时间转换为time_t类型
    std::time_t timeNow = std::chrono::system_clock::to_time_t(now);
    // 将time_t类型转换为本地时间结构体
    std::tm localtimeNow = *std::localtime(&timeNow);
    // 从本地时间结构体中获取年月日信息
    int year = localtimeNow.tm_year + 1900;  // 年份是从1900年开始计数
    int month = localtimeNow.tm_mon + 1;     // 月份是从0开始计数,因此要加1
    int day = localtimeNow.tm_mday;
    int hours = localtimeNow.tm_hour;
    int minutes = localtimeNow.tm_min;
    int seconds = localtimeNow.tm_sec;
    // 打印结果
    std::cout << "当前时间:" << year << "年" << month << "月" << day << "日  " << hours << ":" << minutes << ":" << seconds << std::endl;

    return 0;
}

// chrono的时钟clock有三个方法
// std::chrono::system_clock: 依据系统当前时间
// std::chrono::steady_clock: 不能设置的时钟,以统一速率运行
// std::chrono::high_resolution_clock: 高分辨率时钟
#include <iostream>
#include <chrono>
#include <thread>

using namespace std;

int main()
{
    // 休眠100ms
    std::cout << "sleep 100ms start" << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    std::cout << "sleep 100ms end" << std::endl;


    std::cout << "sleep 1s start" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "sleep 1s end" << std::endl;

    std::cout << "sleep 1min start" << std::endl;
    std::this_thread::sleep_for(std::chrono::minutes(1));
    std::cout << "sleep 1min end" << std::endl;

    std::cout << "sleep 1h start" << std::endl;
    std::this_thread::sleep_for(std::chrono::hours(1));
    std::cout << "sleep 1h end" << std::endl;

    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值