C++ 中使用不同平臺(tái)的時(shí)間函數(shù)及對(duì)比分析
在 C++ 編程中,時(shí)間函數(shù)的選擇對(duì)于性能測(cè)量、任務(wù)調(diào)度和時(shí)間戳記錄至關(guān)重要。不同的操作系統(tǒng)提供了不同的時(shí)間函數(shù),同時(shí)在同一個(gè)平臺(tái)上,也可能有多種不同的時(shí)間函數(shù)可供選擇。本文將介紹在 C++ 中常用的時(shí)間函數(shù),并比較它們?cè)诓煌脚_(tái)上的應(yīng)用和效果。
跨平臺(tái)的時(shí)間函數(shù):std::chrono
隨著 C++11 的引入,標(biāo)準(zhǔn)庫(kù)提供了 std::chrono
,這是一個(gè)現(xiàn)代化的時(shí)間庫(kù),具有高精度和跨平臺(tái)的特性。它基于類型安全和模板化的設(shè)計(jì),使得時(shí)間的測(cè)量和計(jì)算變得更加簡(jiǎn)單和可靠。
#include <iostream> #include <chrono> #include <thread> int main() { // 獲取當(dāng)前時(shí)間點(diǎn) auto start = std::chrono::high_resolution_clock::now(); // 模擬工作(例如,暫停 1 秒) std::this_thread::sleep_for(std::chrono::seconds(1)); // 獲取當(dāng)前時(shí)間點(diǎn) auto end = std::chrono::high_resolution_clock::now(); // 計(jì)算持續(xù)時(shí)間 std::chrono::duration<double> duration = end - start; std::cout << "Duration: " << duration.count() << " seconds\n"; return 0; }
在這個(gè)示例中,std::chrono::high_resolution_clock
提供了高分辨率的時(shí)間點(diǎn),std::chrono::duration<double>
用于表示時(shí)間間隔。這些功能在大多數(shù)現(xiàn)代操作系統(tǒng)上都可用,因此非常適合跨平臺(tái)開(kāi)發(fā)。
Windows 平臺(tái)的時(shí)間函數(shù)
在 Windows 上,有幾種常用的時(shí)間函數(shù),適合不同的時(shí)間需求。
GetSystemTime 和 GetLocalTime
這些函數(shù)提供了系統(tǒng)時(shí)間和本地時(shí)間的訪問(wèn):
#include <iostream> #include <windows.h> int main() { SYSTEMTIME st; GetSystemTime(&st); // 獲取系統(tǒng)時(shí)間(UTC 時(shí)間) std::cout << "System Time (UTC): " << st.wYear << "-" << st.wMonth << "-" << st.wDay << " " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << "." << st.wMilliseconds << "\n"; GetLocalTime(&st); // 獲取本地時(shí)間 std::cout << "Local Time: " << st.wYear << "-" << st.wMonth << "-" << st.wDay << " " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << "." << st.wMilliseconds << "\n"; return 0; }
QueryPerformanceCounter
這是一個(gè)高精度的計(jì)時(shí)器,適合精確測(cè)量時(shí)間間隔:
#include <iostream> #include <windows.h> int main() { LARGE_INTEGER frequency; LARGE_INTEGER start, end; // 獲取高精度計(jì)時(shí)器的頻率 QueryPerformanceFrequency(&frequency); // 獲取開(kāi)始時(shí)間 QueryPerformanceCounter(&start); // 模擬工作(例如,暫停 1 秒) Sleep(1000); // 獲取結(jié)束時(shí)間 QueryPerformanceCounter(&end); // 計(jì)算持續(xù)時(shí)間 double duration = static_cast<double>(end.QuadPart - start.QuadPart) / frequency.QuadPart; std::cout << "High-resolution duration: " << duration << " seconds\n"; return 0; }
Unix/Linux 平臺(tái)的時(shí)間函數(shù)
在 Unix/Linux 系統(tǒng)上,也有多種時(shí)間函數(shù)可供選擇。
gettimeofday
這是一個(gè)高分辨率的計(jì)時(shí)函數(shù),返回自 Epoch 以來(lái)的秒數(shù)和微秒數(shù):
#include <iostream> #include <sys/time.h> int main() { struct timeval tv; gettimeofday(&tv, nullptr); std::cout << "Seconds: " << tv.tv_sec << "\n"; std::cout << "Microseconds: " << tv.tv_usec << "\n"; return 0; }
clock_gettime
提供了更高的精度,并支持多種時(shí)間類型:
#include <iostream> #include <ctime> int main() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); std::cout << "Seconds: " << ts.tv_sec << "\n"; std::cout << "Nanoseconds: " << ts.tv_nsec << "\n"; return 0; }
相同平臺(tái)的不同時(shí)間函數(shù)對(duì)比
即使在同一個(gè)操作系統(tǒng)上,也可能有多個(gè)不同的時(shí)間函數(shù)可供選擇。例如,Windows 上的 GetSystemTime
提供了系統(tǒng)時(shí)間,而 QueryPerformanceCounter
則提供了高精度的計(jì)時(shí)器功能。在 Unix/Linux 上,gettimeofday
和 clock_gettime
分別提供了不同精度和用途的時(shí)間測(cè)量。
使用跨平臺(tái)庫(kù)
除了原生的操作系統(tǒng)時(shí)間函數(shù)外,還可以考慮使用跨平臺(tái)的第三方庫(kù),如 Boost 庫(kù)中的時(shí)間模塊。Boost.Chrono 提供了與 std::chrono
類似的功能,同時(shí)保持了更好的兼容性和可移植性。
#include <iostream> #include <boost/chrono.hpp> int main() { boost::chrono::high_resolution_clock::time_point start = boost::chrono::high_resolution_clock::now(); // 模擬工作 boost::this_thread::sleep_for(boost::chrono::seconds(1)); boost::chrono::high_resolution_clock::time_point end = boost::chrono::high_resolution_clock::now(); boost::chrono::duration<double> duration = end - start; std::cout << "Duration: " << duration.count() << " seconds\n"; return 0; }
結(jié)論
選擇合適的時(shí)間函數(shù)取決于你的應(yīng)用程序需求,如精度、平臺(tái)兼容性和功能特性。在現(xiàn)代 C++ 中,std::chrono
提供了一個(gè)強(qiáng)大的跨平臺(tái)時(shí)間庫(kù),推薦用于大多數(shù)時(shí)間測(cè)量和計(jì)時(shí)任務(wù)。而對(duì)于特定平臺(tái)或需要更高精度的情況,可以考慮使用操作系統(tǒng)提供的特定時(shí)間函數(shù)或第三方庫(kù)進(jìn)行擴(kuò)展。
到此這篇關(guān)于C++ 中使用不同平臺(tái)的時(shí)間函數(shù)及對(duì)比分析的文章就介紹到這了,更多相關(guān)C++時(shí)間函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05VS2019實(shí)現(xiàn)C++的第一個(gè)MFC程序
本文主要介紹了VS2019實(shí)現(xiàn)C++的第一個(gè)MFC程序,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06詳解C語(yǔ)言中accept()函數(shù)和shutdown()函數(shù)的使用
這篇文章主要介紹了詳解C語(yǔ)言中accept()函數(shù)和shutdown()函數(shù)的使用,用來(lái)操作socket相關(guān)的網(wǎng)絡(luò)通信,需要的朋友可以參考下2015-09-09QT實(shí)現(xiàn)自定義Http客戶端的示例代碼
這篇文章主要為大家詳細(xì)介紹了QT如何實(shí)現(xiàn)自定義Http客戶端的,可以實(shí)現(xiàn)支持get,post請(qǐng)求方式;支持連接超時(shí)處理;支持網(wǎng)絡(luò)錯(cuò)誤,嘗試重連等功能,感興趣的小伙伴可以學(xué)習(xí)一下2022-11-11C到C++的升級(jí)關(guān)系及區(qū)別實(shí)例探究
這篇文章主要為大家介紹了C到C++的升級(jí)關(guān)系及區(qū)別實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01C++數(shù)據(jù)結(jié)構(gòu)之紅黑樹(shù)的實(shí)現(xiàn)
紅黑樹(shù)在表意上就是一棵每個(gè)節(jié)點(diǎn)帶有顏色的二叉搜索樹(shù),并通過(guò)對(duì)節(jié)點(diǎn)顏色的控制,使該二叉搜索樹(shù)達(dá)到盡量平衡的狀態(tài)。本文主要為大家介紹了C++中紅黑樹(shù)的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08C語(yǔ)言中判斷int,long型等變量是否賦值的方法詳解
聲明了int ,long型等局部變量,在利用一些方法給這些變量賦值之后,想判斷這些變量是不是真的被賦初值了,怎么辦2013-07-07