欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中std::chrono時(shí)間庫(kù)的全面解析

 更新時(shí)間:2023年10月26日 15:51:47   作者:Lion?Long  
C++?std::chrono時(shí)間庫(kù)是C++標(biāo)準(zhǔn)庫(kù)提供的一個(gè)時(shí)間處理庫(kù),提供了一個(gè)方便、靈活和精確的時(shí)間處理工具,下面小編就帶大家深入了解一下std::chrono時(shí)間庫(kù)的使用吧

一、引言

C++ std::chrono時(shí)間庫(kù)是C++標(biāo)準(zhǔn)庫(kù)提供的一個(gè)時(shí)間處理庫(kù),提供了一個(gè)方便、靈活和精確的時(shí)間處理工具,用于在程序中進(jìn)行時(shí)間相關(guān)的操作和計(jì)算。它具有以下重要性和作用:

精確的時(shí)間計(jì)量:std::chrono時(shí)間庫(kù)提供了高精度的時(shí)間計(jì)量單位和操作,可以精確測(cè)量和計(jì)算代碼的執(zhí)行時(shí)間、延時(shí)等。

跨平臺(tái)兼容性:std::chrono時(shí)間庫(kù)在不同平臺(tái)上都具備良好的兼容性,無(wú)論是Windows、Linux還是其他操作系統(tǒng),都可以使用該庫(kù)進(jìn)行時(shí)間處理,使代碼具備良好的可移植性。

高度可擴(kuò)展性:該庫(kù)提供了豐富的時(shí)間單位和精度選項(xiàng),適應(yīng)不同場(chǎng)景下的時(shí)間計(jì)算需求。無(wú)論是秒、毫秒、微秒還是納秒的時(shí)間單位,都可以很方便地應(yīng)用于代碼中。

時(shí)鐘的靈活選擇:std::chrono時(shí)間庫(kù)提供了不同類型的時(shí)鐘,如系統(tǒng)時(shí)鐘(system_clock)、穩(wěn)定時(shí)鐘(steady_clock)和高分辨率時(shí)鐘(high_resolution_clock),可以根據(jù)具體需求選擇合適的時(shí)鐘類型。

時(shí)間點(diǎn)和時(shí)間段的處理:該庫(kù)提供了表示時(shí)間點(diǎn)(time_point)和時(shí)間段(duration)的相關(guān)類,可以對(duì)時(shí)間進(jìn)行精確刻度和處理。時(shí)間點(diǎn)表示具體的時(shí)間,時(shí)間段表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差。

C++ std::chrono時(shí)間庫(kù)能夠幫助準(zhǔn)確測(cè)量和控制代碼的執(zhí)行時(shí)間,處理定時(shí)任務(wù),進(jìn)行時(shí)間間隔計(jì)算等操作。這里將全面介紹C++ std::chrono時(shí)間庫(kù)的使用,幫助讀者理解其核心概念和各種功能,從而在編程中更好地掌握時(shí)間的節(jié)奏,解放代碼從時(shí)間束縛中。

目標(biāo):

  • 首先對(duì)C++ std::chrono時(shí)間庫(kù)進(jìn)行全面而清晰的概述,解釋其在編程中的重要性和作用。
  • 詳細(xì)講解C++ std::chrono時(shí)間庫(kù)的組成部分,包括duration、time_point和clock。了解它們是如何相互配合工作的,以及如何使用它們來(lái)進(jìn)行時(shí)間相關(guān)的操作。
  • 供詳細(xì)的使用攻略,涵蓋duration(時(shí)間段)的使用方法、單位和精度的選擇、示例代碼等;time_point(時(shí)間點(diǎn))的創(chuàng)建、比較和操作方法,以及相關(guān)的應(yīng)用場(chǎng)景;不同類型的時(shí)鐘(clock)的特點(diǎn)、適用場(chǎng)景和使用方法等。
  • 除了基本的使用方法,還將探討一些高級(jí)技巧和實(shí)踐,如時(shí)區(qū)處理、時(shí)間格式轉(zhuǎn)換等。我們還將解決一些常見的時(shí)間相關(guān)問(wèn)題,提供實(shí)用的技巧和最佳實(shí)踐,更高效、準(zhǔn)確地使用時(shí)間庫(kù),解放代碼從時(shí)間束縛中。

二、C++ std::chrono時(shí)間庫(kù)概述

2.1、std::chrono命名空間的作用和用途

C++ std::chrono命名空間是C++標(biāo)準(zhǔn)庫(kù)中的一個(gè)命名空間,它包含了一組用于處理時(shí)間和時(shí)間相關(guān)操作的類和函數(shù)。該命名空間提供了豐富的時(shí)間處理功能,旨在方便進(jìn)行時(shí)間計(jì)算、測(cè)量和控制。

std::chrono命名空間的主要作用和用途:

1.提供時(shí)間單位和精度的定義:std::chrono命名空間定義了一系列時(shí)間單位,如秒(seconds)、毫秒(milliseconds)、微秒(microseconds)和納秒(nanoseconds),以及精度等級(jí),如高精度時(shí)鐘(high_resolution_clock)和穩(wěn)定時(shí)鐘(steady_clock)。這些定義使得時(shí)間計(jì)算和測(cè)量更加靈活和精確。

2.定義時(shí)間段和時(shí)間點(diǎn)的概念:std::chrono命名空間提供了表示時(shí)間段(duration)和時(shí)間點(diǎn)(time_point)的相關(guān)類,包括std::chrono::duration和std::chrono::time_point。時(shí)間段表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差,時(shí)間點(diǎn)表示具體的時(shí)間。

3.支持時(shí)間的計(jì)算和操作:該命名空間提供了各種用于時(shí)間計(jì)算和操作的函數(shù)和操作符。例如,可以通過(guò)相加或相減兩個(gè)時(shí)間點(diǎn)或時(shí)間段來(lái)計(jì)算時(shí)間的差異、延遲或間隔。也可以比較兩個(gè)時(shí)間點(diǎn)的先后順序,判斷時(shí)間的先后關(guān)系。

4.管理和控制時(shí)間流逝:std::chrono命名空間提供了函數(shù)和工具,可用于管理和控制時(shí)間的流逝。例如,可以獲取當(dāng)前的系統(tǒng)時(shí)間和時(shí)鐘時(shí)間,或者獲取程序執(zhí)行的實(shí)際時(shí)間。還可以設(shè)置定時(shí)任務(wù)或者延時(shí)執(zhí)行代碼。

5.std::chrono命名空間是C++標(biāo)準(zhǔn)庫(kù)的一部分,因此它具有跨平臺(tái)的兼容性,并且在不同的操作系統(tǒng)中都能正常工作。

2.2、基本組成部分:duration、time_point和clock

時(shí)間庫(kù)的基本組成部分包括duration(時(shí)間段)、time_point(時(shí)間點(diǎn))和clock(時(shí)鐘)。它們相互配合,用于表示和處理時(shí)間的不同方面。

duration(時(shí)間段):

duration是時(shí)間庫(kù)中表示時(shí)間段的類。它表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差。時(shí)間段可以用秒(seconds)、毫秒(milliseconds)、微秒(microseconds)等不同的單位來(lái)表示。duration類的模板參數(shù)包括時(shí)間單位和所需的精度。比如:std::chrono::duration<int, std::ratio<1, 1000>>表示毫秒級(jí)別的時(shí)間段。在使用Duration時(shí),可以進(jìn)行加減、比較和表示等操作。

time_point(時(shí)間點(diǎn)):

time_point表示一個(gè)特定的時(shí)間點(diǎn),可以理解為時(shí)間的戳記。時(shí)間點(diǎn)和時(shí)間段之間可以進(jìn)行加減運(yùn)算,用于計(jì)算時(shí)間的差異或延遲。time_point類的模板參數(shù)包括所采用的時(shí)鐘類型和時(shí)間單位。比如:std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>表示系統(tǒng)時(shí)鐘下的納秒級(jí)時(shí)間點(diǎn)??梢垣@取當(dāng)前的時(shí)間點(diǎn)、比較不同時(shí)間點(diǎn)的順序,以及對(duì)時(shí)間點(diǎn)進(jìn)行格式化等操作。

clock(時(shí)鐘):

clock是時(shí)間庫(kù)中的時(shí)鐘類,用于提供時(shí)間的基準(zhǔn)和計(jì)量。不同的時(shí)鐘類型提供不同的時(shí)間精度和功能。常用的時(shí)鐘類型有系統(tǒng)時(shí)鐘(system_clock)、穩(wěn)定時(shí)鐘(steady_clock)和高精度時(shí)鐘(high_resolution_clock)。系統(tǒng)時(shí)鐘提供了與操作系統(tǒng)相關(guān)的時(shí)間,穩(wěn)定時(shí)鐘提供了穩(wěn)定的、不受系統(tǒng)時(shí)間變化影響的時(shí)間,而高精度時(shí)鐘提供了更高的時(shí)間精度。時(shí)鐘類可以獲取當(dāng)前時(shí)間,計(jì)算時(shí)間的間隔和延遲等。

這三個(gè)基本組成部分相互配合,使時(shí)間庫(kù)具有了強(qiáng)大的時(shí)間處理能力。Duration表示時(shí)間段,Time_point表示時(shí)間點(diǎn),而Clock則提供了時(shí)鐘的基準(zhǔn)。通過(guò)使用它們,可以對(duì)時(shí)間進(jìn)行準(zhǔn)確的計(jì)算、比較和操作,從而靈活地處理時(shí)間相關(guān)的任務(wù)和邏輯。

三、duration的使用詳解

3.1、duration表示時(shí)間段的概念和使用方法

Duration(時(shí)間段)是時(shí)間庫(kù)中表示時(shí)間間隔的類,用于表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間差。

1.表示和定義duration:

duration類是一個(gè)模板類,模板參數(shù)包括時(shí)間單位和精度。時(shí)間單位可以是秒(seconds)、毫秒(milliseconds)、微秒(microseconds)或納秒(nanoseconds),精度可以是整數(shù)類型(int、long)、浮點(diǎn)類型(float、double)等。例如,可以定義一個(gè)表示毫秒級(jí)別的時(shí)間段:std::chrono::duration<int, std::milli>。

2.創(chuàng)建duration對(duì)象:

可以通過(guò)直接給Duration對(duì)象賦值來(lái)創(chuàng)建它。對(duì)Duration對(duì)象的賦值可以使用整數(shù)、浮點(diǎn)數(shù)、其他duration對(duì)象,以及乘法、除法、加法和減法等操作。例如:

std::chrono::duration<int, std::milli> duration1(500); // 創(chuàng)建一個(gè)表示500毫秒的duration對(duì)象
std::chrono::duration<double, std::ratio<1, 1000>> duration2 = 2.5; // 創(chuàng)建一個(gè)表示2.5毫秒的duration對(duì)象
std::chrono::duration<float, std::ratio<1>> duration3 = duration1 + duration2; // 創(chuàng)建一個(gè)表示3秒的duration對(duì)象

3.訪問(wèn)duration的值:

可以使用成員函數(shù)count()來(lái)訪問(wèn)Duration對(duì)象的值。count()函數(shù)返回Duration對(duì)象表示的時(shí)間段值,以它所定義的時(shí)間單位返回。例如:

std::chrono::duration<int, std::milli> duration(500);
int milliseconds = duration.count(); // 返回500

4.操作duration:

可以使用各種數(shù)學(xué)運(yùn)算符對(duì)duration對(duì)象進(jìn)行加法、減法、乘法和除法等操作。這些操作在邏輯上保持了時(shí)間單位的一致性。例如:

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毫秒

5.比較duration:

可以使用比較運(yùn)算符(<、<=、>、>=、==、!=)來(lái)比較duration對(duì)象之間的大小關(guān)系。比較操作是基于Duration對(duì)象所表示的時(shí)間單位進(jìn)行的。例如:

std::chrono::duration<int, std::milli> duration1(500);
std::chrono::duration<double, std::nano> duration2(1.5);
bool result = duration1 > duration2; // 返回true,因?yàn)?00毫秒大于1.5納秒

3.2、duration的各種單位和精度選項(xiàng)

時(shí)間單位(Time Units)。時(shí)間單位表示Duration所表示時(shí)間間隔的度量單位。時(shí)間單位包括:

  • 納秒(nanoseconds):std::chrono::nanoseconds
  • 微秒(microseconds):std::chrono::microseconds
  • 毫秒(milliseconds):std::chrono::milliseconds
  • 秒(seconds):std::chrono::seconds
  • 分鐘(minutes):std::chrono::minutes
  • 小時(shí)(hours):std::chrono::hours

這些單位可以提供不同精度的時(shí)間間隔表示。

精度(Precision):

精度表示duration所使用的數(shù)值類型,可以是整型(整數(shù)類型)或浮點(diǎn)型(浮點(diǎn)數(shù)類型)??梢允褂脴?biāo)準(zhǔn)數(shù)值類型(如int、long、float、double)作為Duration的數(shù)值類型,并與所選的時(shí)間單位進(jìn)行配對(duì)。
例如,可以選擇使用以下精度選項(xiàng):

  • 整數(shù)類型精度:std::chrono::duration<int, TimeUnit>
  • 長(zhǎng)整數(shù)類型精度:std::chrono::duration<long, TimeUnit>
  • 浮點(diǎn)類型精度:std::chrono::duration<float, TimeUnit>
  • 雙精度類型精度:std::chrono::duration<double, TimeUnit>

例如,如果需要表示毫秒級(jí)別的時(shí)間間隔,可以選擇std::chrono::duration<int, std::milli>,它使用整數(shù)類型表示毫秒。

下面是一些示例,展示了如何使用不同的時(shí)間單位和精度選項(xiàng):

using namespace std::chrono;

// 表示10毫秒的duration,使用整數(shù)類型精度
duration<int, std::milli> duration1(10);

// 表示5秒的duration,使用長(zhǎng)整數(shù)類型精度
duration<long, std::seconds> duration2(5);

// 表示2.5秒的duration,使用浮點(diǎn)類型精度
duration<float, std::seconds> duration3(2.5);

// 表示1分鐘的duration,使用雙精度類型精度
duration<double, std::minutes> duration4(1);

// 可以使用auto關(guān)鍵字自動(dòng)推導(dǎo)出duration的類型
auto duration5 = duration<int, std::micro>(100);

3.3、使用示例

以下是一些使用Duration的具體示例,涵蓋時(shí)間計(jì)算和延時(shí)操作:

時(shí)間計(jì)算示例:

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;

    // 創(chuàng)建兩個(gè)時(shí)間點(diǎn)
    steady_clock::time_point start = steady_clock::now();
    std::this_thread::sleep_for(std::chrono::seconds(2)); // 模擬耗時(shí)操作
    steady_clock::time_point end = steady_clock::now();

    // 計(jì)算時(shí)間間隔
    duration<double> duration = duration_cast<duration<double>>(end - start);

    // 輸出時(shí)間間隔
    std::cout << "Elapsed time: " << duration.count() << " seconds\n";

    return 0;
}

上述示例中,使用steady_clock來(lái)獲取當(dāng)前時(shí)間點(diǎn),并通過(guò)duration_cast將時(shí)間間隔轉(zhuǎn)換為秒。最后,使用count()函數(shù)獲取時(shí)間間隔的值并進(jìn)行輸出。

延時(shí)操作示例:

#include <iostream>
#include <chrono>
#include <thread>

int main() {
    using namespace std::chrono;

    std::cout << "Start" << std::endl;

    // 進(jìn)行延時(shí)操作,暫停程序執(zhí)行
    std::this_thread::sleep_for(std::chrono::seconds(2));

    std::cout << "End" << std::endl;

    return 0;
}

使用this_thread::sleep_for函數(shù)來(lái)進(jìn)行延時(shí)操作,程序會(huì)暫停執(zhí)行2秒鐘,然后繼續(xù)往下執(zhí)行。

四、time_point的使用詳解

4.1、time_point表示具體時(shí)間點(diǎn)的概念和使用方法

time_point(時(shí)間點(diǎn))是std::chrono庫(kù)中用于表示具體時(shí)間的類型。它表示了某個(gè)具體時(shí)刻的時(shí)間點(diǎn),可以用于比較不同時(shí)間點(diǎn)的時(shí)間先后或時(shí)間間隔的計(jì)算。

time_point由兩部分組成:時(shí)鐘(Clock)和表示時(shí)間的持續(xù)時(shí)間(Duration)。

1.時(shí)鐘(Clock):

時(shí)鐘是std::chrono庫(kù)中的一種類型,用于測(cè)量時(shí)間的流逝。std::chrono庫(kù)提供了幾種不同的時(shí)鐘類型,包括steady_clock(穩(wěn)定時(shí)鐘)、system_clock(系統(tǒng)時(shí)鐘)和high_resolution_clock(高分辨率時(shí)鐘)等。不同的時(shí)鐘類型提供了不同的時(shí)間精度和適用范圍。

2.表示時(shí)間的持續(xù)時(shí)間(Duration):

Duration表示時(shí)間的長(zhǎng)度或時(shí)間間隔,可以是納秒、微秒、毫秒、秒、分鐘、小時(shí)等不同的時(shí)間單位。Duration類的模板參數(shù)指定了時(shí)間長(zhǎng)度的數(shù)值類型和時(shí)間單位。

使用方法:

要?jiǎng)?chuàng)建一個(gè)time_point對(duì)象,需要指定時(shí)鐘類型和持續(xù)時(shí)間。可以使用當(dāng)前的時(shí)鐘來(lái)獲取當(dāng)前時(shí)間點(diǎn),也可以根據(jù)需求指定一個(gè)特定的時(shí)間點(diǎn)。示例:

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;

    // 使用系統(tǒng)時(shí)鐘獲取當(dāng)前時(shí)間點(diǎn)
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();

    // 創(chuàng)建一個(gè)表示特定時(shí)間點(diǎn)的time_point
    std::chrono::system_clock::time_point specific_time = 
        std::chrono::system_clock::time_point(std::chrono::seconds(1625100000));

    // 比較兩個(gè)時(shí)間點(diǎn)的先后
    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";
    }

    // 計(jì)算時(shí)間間隔
    std::chrono::duration<double> duration = now - specific_time;
    std::cout << "The duration between the two time points is: " << duration.count() << " seconds.\n";

    return 0;
}

通過(guò)std::chrono庫(kù)中的system_clock獲取了當(dāng)前時(shí)間點(diǎn),并通過(guò)手動(dòng)指定一個(gè)特定的時(shí)間點(diǎn)。然后,可以比較這兩個(gè)時(shí)間點(diǎn)的先后,并計(jì)算它們之間的時(shí)間間隔。

4.2、time_point與duration之間的關(guān)系

time_point表示一個(gè)具體的時(shí)間點(diǎn),可以視為時(shí)間的參考點(diǎn)或標(biāo)記。它由兩個(gè)組成部分構(gòu)成:時(shí)鐘(Clock)和持續(xù)時(shí)間(Duration)。時(shí)鐘指定了時(shí)間的基準(zhǔn)和精度,而持續(xù)時(shí)間表示兩個(gè)時(shí)間點(diǎn)之間的時(shí)間間隔。

duration表示一個(gè)時(shí)間長(zhǎng)度或時(shí)間間隔,它可以是納秒、微秒、毫秒、秒、分鐘、小時(shí)等不同的時(shí)間單位。

duration模板類的參數(shù)指定了時(shí)間長(zhǎng)度的數(shù)值類型和時(shí)間單位。持續(xù)時(shí)間的正負(fù)值決定了時(shí)間間隔是向前還是向后。

time_point和duration之間的關(guān)系:

  • 通過(guò)time_point和duration的組合,可以表示一個(gè)時(shí)間點(diǎn),也可以計(jì)算兩個(gè)時(shí)間點(diǎn)之間的時(shí)間間隔。
  • 可以在time_point上添加或減去某個(gè)duration,以獲得新的time_point。例如,可以將一個(gè)time_point向前推進(jìn)一個(gè)duration,或者將一個(gè)duration加上一個(gè)time_point來(lái)計(jì)算未來(lái)的時(shí)間點(diǎn)。
  • 可以通過(guò)計(jì)算兩個(gè)time_point之間的時(shí)間間隔,得到一個(gè)duration對(duì)象。這是通過(guò)減去一個(gè)time_point(較早的時(shí)間點(diǎn))從另一個(gè)time_point(較晚的時(shí)間點(diǎn))來(lái)實(shí)現(xiàn)的。

下面是一個(gè)使用time_point和duration的示例,展示了它們之間的關(guān)系:

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;

    // 獲取當(dāng)前時(shí)間點(diǎn)
    system_clock::time_point start = system_clock::now();

    // 進(jìn)行一些耗時(shí)操作
    std::this_thread::sleep_for(std::chrono::seconds(2));

    // 獲取后續(xù)的時(shí)間點(diǎn)
    system_clock::time_point end = system_clock::now();

    // 計(jì)算時(shí)間間隔
    duration<double> duration = duration_cast<duration<double>>(end - start);

    // 輸出時(shí)間間隔
    std::cout << "Elapsed time: " << duration.count() << " seconds\n";

    return 0;
}

說(shuō)明:使用system_clock獲取了開始和結(jié)束的時(shí)間點(diǎn),然后通過(guò)減法操作計(jì)算時(shí)間間隔duration。最后,使用duration的count()方法獲取時(shí)間間隔的值,并輸出結(jié)果。這個(gè)示例演示了如何結(jié)合使用time_point和duration來(lái)計(jì)算時(shí)間間隔。

4.3、如何創(chuàng)建、比較和操作time_point對(duì)象

演示了如何創(chuàng)建、比較和操作time_point對(duì)象:

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;

    // 創(chuàng)建一個(gè)time_point對(duì)象 - 使用系統(tǒng)時(shí)鐘獲取當(dāng)前時(shí)間點(diǎn)
    system_clock::time_point now = system_clock::now();

    // 創(chuàng)建一個(gè)time_point對(duì)象 - 手動(dòng)指定一個(gè)特定時(shí)間點(diǎn)
    system_clock::time_point specific_time = system_clock::time_point(seconds(1625100000));

    // 比較兩個(gè)time_point對(duì)象的先后
    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對(duì)象,計(jì)算時(shí)間間隔
    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;
}

說(shuō)明:使用system_clock獲取了當(dāng)前時(shí)間點(diǎn),并通過(guò)手動(dòng)指定一個(gè)特定的時(shí)間點(diǎn)創(chuàng)建了另一個(gè)time_point對(duì)象。然后,比較這兩個(gè)time_point對(duì)象的先后關(guān)系,并輸出結(jié)果。接下來(lái),操作time_point對(duì)象,通過(guò)將一個(gè)duration(48小時(shí))加到當(dāng)前時(shí)間點(diǎn)上,得到一個(gè)未來(lái)的時(shí)間點(diǎn)。最后,我們計(jì)算了當(dāng)前時(shí)間點(diǎn)和未來(lái)時(shí)間點(diǎn)之間的時(shí)間間隔,并輸出結(jié)果。

注意:在計(jì)算時(shí)間間隔時(shí),使用了duration_cast將時(shí)間間隔轉(zhuǎn)換為所需的duration類型(在這里是double類型)。

五、clock的使用詳解

5.1、不同類型的clock

在std::chrono庫(kù)中,存在三種不同類型的時(shí)鐘:system_clock、steady_clock和high_resolution_clock。它們都用于表示時(shí)間點(diǎn)和測(cè)量時(shí)間間隔,但在實(shí)際應(yīng)用中會(huì)有一些區(qū)別。

1.system_clock:

  • system_clock是系統(tǒng)級(jí)別的時(shí)鐘,它表示實(shí)時(shí)時(shí)鐘,也就是指示當(dāng)前時(shí)間的時(shí)鐘。它的時(shí)間點(diǎn)是與系統(tǒng)的時(shí)鐘相關(guān)聯(lián)的,可能受到時(shí)鐘調(diào)整和時(shí)區(qū)的影響。
  • system_clock用于獲取當(dāng)前的系統(tǒng)時(shí)間,可以用來(lái)進(jìn)行日常時(shí)間計(jì)算和顯示。它通常被用作默認(rèn)的時(shí)鐘類型。
  • system_clock的最小時(shí)間單位取決于系統(tǒng),可能是秒、毫秒或微秒。

2.steady_clock:

  • steady_clock是一個(gè)單調(diào)遞增的時(shí)鐘,不受任何時(shí)鐘調(diào)整或時(shí)區(qū)的影響。它提供了一個(gè)穩(wěn)定、可靠的時(shí)間基準(zhǔn),適合用于測(cè)量時(shí)間間隔和計(jì)算算法的執(zhí)行時(shí)間。
  • steady_clock的最小時(shí)間單位取決于實(shí)現(xiàn),通常是納秒或微秒級(jí)別。

3.high_resolution_clock:

  • high_resolution_clock是一個(gè)可用于測(cè)量小時(shí)間間隔的時(shí)鐘。它通常使用最高分辨率的時(shí)鐘源來(lái)提供更高的時(shí)間精度。在大部分平臺(tái)上,high_resolution_clock是steady_clock的別名,因此也是一個(gè)單調(diào)遞增的時(shí)鐘。
  • high_resolution_clock的最小時(shí)間單位取決于實(shí)現(xiàn),通常是納秒或微秒級(jí)別。

使用不同類型的時(shí)鐘的示例:

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;

    // 使用system_clock獲取當(dāng)前時(shí)間
    system_clock::time_point system_now = system_clock::now();

    // 使用steady_clock獲取開始時(shí)間
    steady_clock::time_point steady_start = steady_clock::now();

    // 一些操作...

    // 使用steady_clock獲取結(jié)束時(shí)間
    steady_clock::time_point steady_end = steady_clock::now();

    // 使用high_resolution_clock獲取開始時(shí)間
    high_resolution_clock::time_point high_res_start = high_resolution_clock::now();

    // 一些操作...

    // 使用high_resolution_clock獲取結(jié)束時(shí)間
    high_resolution_clock::time_point high_res_end = high_resolution_clock::now();

    // 輸出時(shí)間間隔
    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;
}

說(shuō)明:使用system_clock獲取了當(dāng)前時(shí)間,使用steady_clock和high_resolution_clock獲取了開始和結(jié)束時(shí)間。然后,通過(guò)減法操作計(jì)算了時(shí)間間隔,并使用duration_cast將時(shí)間間隔轉(zhuǎn)換為double類型的秒數(shù)。最后,輸出了steady_clock和high_resolution_clock的時(shí)間間隔。

5.2、每種clock的特點(diǎn)和適用場(chǎng)景

不同類型的時(shí)鐘(system_clock、steady_clock和high_resolution_clock)具有不同的特點(diǎn)和適用場(chǎng)景

1.system_clock:

特點(diǎn):system_clock是一個(gè)系統(tǒng)級(jí)別的時(shí)鐘,用于表示實(shí)時(shí)時(shí)鐘,它的時(shí)間點(diǎn)是與系統(tǒng)相關(guān)聯(lián)的。它可以受到時(shí)鐘調(diào)整和時(shí)區(qū)的影響。

適用場(chǎng)景:system_clock適用于獲取當(dāng)前的系統(tǒng)時(shí)間、進(jìn)行日常時(shí)間計(jì)算和顯示。它通常被用作默認(rèn)的時(shí)鐘類型。

2.steady_clock:

特點(diǎn):steady_clock是一個(gè)單調(diào)遞增的時(shí)鐘,不受任何時(shí)鐘調(diào)整或時(shí)區(qū)的影響,提供了一個(gè)穩(wěn)定、可靠的時(shí)間基準(zhǔn)。

適用場(chǎng)景:steady_clock適用于測(cè)量時(shí)間間隔、計(jì)算算法的執(zhí)行時(shí)間等希望得到穩(wěn)定和可靠時(shí)間測(cè)量的場(chǎng)景。由于不受時(shí)鐘調(diào)整的影響,它特別適合用于計(jì)算程序的運(yùn)行時(shí)間、測(cè)量短時(shí)間間隔等要求精確性的計(jì)時(shí)操作。

3.high_resolution_clock:

特點(diǎn):high_resolution_clock是一個(gè)可用于測(cè)量小時(shí)間間隔的時(shí)鐘,通常使用最高分辨率的時(shí)鐘源來(lái)提供更高的時(shí)間精度。在大部分平臺(tái)上,high_resolution_clock是steady_clock的別名,因此也是一個(gè)單調(diào)遞增的時(shí)鐘。

適用場(chǎng)景:high_resolution_clock可以用于需要更高時(shí)間精度的場(chǎng)景,比如測(cè)量微小的時(shí)間間隔、對(duì)性能進(jìn)行優(yōu)化的任務(wù),或者需要盡可能精確的時(shí)間測(cè)量。

注意:不同的平臺(tái)可能對(duì)這些時(shí)鐘的實(shí)現(xiàn)有所不同,最小時(shí)間單位也可能有所不同??梢允褂胐uration_cast將時(shí)間間隔轉(zhuǎn)換為所需的時(shí)間單位(例如秒、毫秒、納秒等)。

如果需要表示當(dāng)前實(shí)時(shí)時(shí)間、進(jìn)行日常時(shí)間計(jì)算和顯示,可以使用system_clock。而如果需要測(cè)量時(shí)間間隔、計(jì)算算法的執(zhí)行時(shí)間等,可以使用steady_clock。如果需要更高的時(shí)間精度,可以使用high_resolution_clock。

六、應(yīng)用示例

定時(shí)任務(wù)??梢允褂胹td::this_thread::sleep_for函數(shù)來(lái)創(chuàng)建定時(shí)任務(wù)。每隔一秒打印一次消息的示例:

#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));
    }
}

測(cè)量代碼執(zhí)行時(shí)間:使用std::chrono::steady_clock可以測(cè)量代碼塊的執(zhí)行時(shí)間。測(cè)量排序算法的執(zhí)行時(shí)間:

#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;
}

使代碼跨平臺(tái)。使用std::chrono可以實(shí)現(xiàn)跨平臺(tái)的時(shí)間處理,避免依賴于特定平臺(tái)的系統(tǒng)調(diào)用。獲取當(dāng)前時(shí)間點(diǎn)并打印出來(lái):

#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;
}

時(shí)間格式化:std::chrono庫(kù)提供了一些用于格式化時(shí)間的函數(shù)和類。可以使用std::put_time函數(shù)將時(shí)間對(duì)象格式化為字符串,并指定所需的時(shí)間格式。它接受一個(gè)時(shí)間對(duì)象和格式化字符串作為參數(shù),返回一個(gè)格式化后的字符串。示例代碼如下:

#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;
}

說(shuō)明:將當(dāng)前時(shí)間格式化為日期和時(shí)間的字符串,并以本地時(shí)間格式(“%c”)進(jìn)行輸出。

總結(jié)

C++的std::chrono時(shí)間庫(kù)提供了處理時(shí)間相關(guān)操作的功能。

核心概念:

時(shí)鐘(Clock):表示時(shí)間的源頭,提供了時(shí)間的基準(zhǔn)和刻度。常見的時(shí)鐘有系統(tǒng)時(shí)鐘(system_clock)、穩(wěn)定時(shí)鐘(steady_clock)和高精度時(shí)鐘(high_resolution_clock)。

時(shí)間點(diǎn)(Time Point):表示特定時(shí)鐘上的一個(gè)時(shí)間。時(shí)間點(diǎn)可使用時(shí)鐘的成員函數(shù)now()獲取,也可以通過(guò)時(shí)鐘的to_time_point()函數(shù)從時(shí)間表示轉(zhuǎn)換得到。

時(shí)間間隔(Duration):表示一段時(shí)間的表示,可以是秒、毫秒、微秒、納秒等等。時(shí)間間隔的類型為duration,比如duration<int, std::ratio<1, 1000>>表示毫秒。

使用方法:

獲取當(dāng)前時(shí)間點(diǎn):使用時(shí)鐘的now()成員函數(shù)可以獲取當(dāng)前時(shí)間點(diǎn),返回一個(gè)時(shí)間點(diǎn)對(duì)象。

std::chrono::system_clock::time_point now = std::chrono::system_clock::now();

計(jì)算時(shí)間間隔:使用時(shí)間點(diǎn)對(duì)象相減可以計(jì)算時(shí)間間隔,返回一個(gè)時(shí)間間隔對(duì)象。

std::chrono::duration<double> diff = end - start;
double seconds = diff.count();

休眠指定時(shí)間:使用std::this_thread::sleep_for()函數(shù)可以使當(dāng)前線程休眠指定的時(shí)間間隔。

std::this_thread::sleep_for(std::chrono::seconds(1));

轉(zhuǎn)換時(shí)間表示:可以通過(guò)時(shí)鐘的成員函數(shù)to_time_t()將時(shí)間點(diǎn)對(duì)象轉(zhuǎn)換為time_t表示,或使用ctime()函數(shù)將time_t轉(zhuǎn)換為字符串表示。

std::time_t time = std::chrono::system_clock::to_time_t(now);
std::cout << "Current time: " << std::ctime(&time) << std::endl;

以上就是C++中std::chrono時(shí)間庫(kù)的全面解析的詳細(xì)內(nèi)容,更多關(guān)于C++ std::chrono時(shí)間庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++中函數(shù)重載詳解

    C++中函數(shù)重載詳解

    大家好,本篇文章主要講的是C++中函數(shù)重載詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C++?的cout格式化輸出場(chǎng)景示例詳解

    C++?的cout格式化輸出場(chǎng)景示例詳解

    這篇文章主要為大家介紹了C++的cout格式化輸出場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • C++ Boost Graph算法超詳細(xì)精講

    C++ Boost Graph算法超詳細(xì)精講

    這篇文章主要介紹了C++ Boost Graph算法,我門嘗試使用Boost.Graph庫(kù)來(lái)運(yùn)行Goldberg的最大流算法。 Boost.Graph將其稱為push_relabel_max_flow
    2022-10-10
  • 利用Matlab復(fù)刻羊了個(gè)羊小游戲

    利用Matlab復(fù)刻羊了個(gè)羊小游戲

    最近羊了個(gè)羊游戲可謂是異常火爆,身邊幾乎都在玩,他其實(shí)就是一個(gè)簡(jiǎn)單的卡通背景消除闖關(guān)游戲,本文將用Matlab復(fù)刻這一游戲,感興趣的可以了解一下
    2022-09-09
  • 關(guān)于C++運(yùn)算符重載的一些困惑詳解

    關(guān)于C++運(yùn)算符重載的一些困惑詳解

    這篇文章主要給大家介紹了關(guān)于C++運(yùn)算符重載的一些困惑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語(yǔ)言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼

    C語(yǔ)言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼

    24點(diǎn)是一種益智游戲,24點(diǎn)是把4個(gè)整數(shù)(一般是正整數(shù))通過(guò)加減乘除以及括號(hào)運(yùn)算,使最后的計(jì)算結(jié)果是24的一個(gè)數(shù)學(xué)游戲,24點(diǎn)可以考驗(yàn)人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。本文將用C語(yǔ)言實(shí)現(xiàn)這一游戲,感興趣的可以了解一下
    2022-08-08
  • C++模版函數(shù)詳解

    C++模版函數(shù)詳解

    C++中的模版總體可以分為兩大類:模版函數(shù)、模版類。本篇文章先寫模版函數(shù),需要的朋友可以參考下
    2017-02-02
  • QT實(shí)現(xiàn)單詞檢索軟件的示例代碼

    QT實(shí)現(xiàn)單詞檢索軟件的示例代碼

    本文主要介紹了QT實(shí)現(xiàn)單詞檢索軟件的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++采用TLS線程局部存儲(chǔ)的用法實(shí)例

    C++采用TLS線程局部存儲(chǔ)的用法實(shí)例

    這篇文章主要介紹了C++采用TLS線程局部存儲(chǔ)的用法實(shí)例,詳細(xì)講述了TLS索引及線程的操作,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言陷阱與缺陷之?dāng)?shù)組越界訪問(wèn)詳解

    C語(yǔ)言陷阱與缺陷之?dāng)?shù)組越界訪問(wèn)詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的數(shù)組越界訪問(wèn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02

最新評(píng)論