C/C++計(jì)算程序執(zhí)行時(shí)間的幾種方法實(shí)現(xiàn)
引言
我們?cè)趯懰惴〞r(shí)要考慮到算法的執(zhí)行效率,有的題目規(guī)定了時(shí)間限制,我們需要在這個(gè)時(shí)間之內(nèi)去解決問題。如果我們需要比對(duì)算法的好壞,就需要輸出這個(gè)程序運(yùn)行了多長(zhǎng)時(shí)間。
在C或C++中計(jì)算程序執(zhí)行時(shí)間,可以使用多種方法,下面我介紹幾種比較常見且好用的幾種方法,大家可以選擇適合自己的一種記住就可以了。
方法1:使用 clock() 函數(shù)(C/C++)
在C/C++中,<time.h>
庫提供了clock()
函數(shù)。這個(gè)方法是博主比較推薦的一個(gè),非常簡(jiǎn)便,且易懂,它用于測(cè)量程序的CPU時(shí)間。clock()
函數(shù)返回程序從啟動(dòng)到函數(shù)被調(diào)用時(shí)所經(jīng)過的時(shí)鐘周期數(shù)。這個(gè)函數(shù)主要用于測(cè)量程序的CPU時(shí)間消耗,而不是實(shí)際的墻鐘時(shí)間(即從墻上的時(shí)鐘測(cè)量的時(shí)間)。
函數(shù)原型
clock_t clock(void);
clock_t
類型,表示自程序啟動(dòng)以來的時(shí)鐘周期數(shù)。
使用實(shí)例:
以下是使用clock()
函數(shù)計(jì)算遞歸與非遞歸程序執(zhí)行時(shí)間的示例代碼:
#include<iostream> #include<time.h> using namespace std; typedef long long ll; ll n, sum=1; ll fun(int dep) {//遞歸函數(shù) if (dep == 1) { return 1; } else { return 2 * (fun(dep - 1) + 1); } } void test0() {//非遞歸直接利用數(shù)學(xué)公式推理 cin >> n; for (int i = 0; i < n-1; i++) { sum = (sum + 1) * 2; } cout << sum << endl; //printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC); } void test01() { cin >> n; cout << fun(n) << endl; //printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC); } int main() { // 開始時(shí)間 clock_t start = clock(); // 要執(zhí)行的代碼 // ... test01(); // 結(jié)束時(shí)間 clock_t end = clock(); // 計(jì)算執(zhí)行時(shí)間(以秒為單位) double execution_time = (double)(end - start) / CLOCKS_PER_SEC; // 輸出執(zhí)行時(shí)間 printf("程序執(zhí)行時(shí)間:%f 秒\n", execution_time); return 0; }
第一個(gè)是 遞歸的程序占用CPU的時(shí)間,第二個(gè)是非遞歸的程序占用CPU的時(shí)間。
注意事項(xiàng)
CLOCKS_PER_SEC
是<time.h>
庫中定義的一個(gè)宏,表示每秒的時(shí)鐘周期數(shù)。- (end - start) 單位是毫秒, 除以CLOCKS_PER_SEC周期轉(zhuǎn)化為以秒為單位。
clock()
函數(shù)返回的是程序占用CPU的時(shí)間 ≠ 程序的實(shí)際運(yùn)行時(shí)間。clock()
函數(shù)返回的是程序占用CPU的時(shí)間,不包括睡眠時(shí)間或其他非CPU時(shí)間。- 在多處理器系統(tǒng)上,
clock()
函數(shù)的行為可能有所不同,具體取決于操作系統(tǒng)的實(shí)現(xiàn)。 clock()
函數(shù)的精度依賴于系統(tǒng),可能每次運(yùn)行程序可能不相同。
clock()
函數(shù)是測(cè)量程序性能的一個(gè)簡(jiǎn)單工具,但它不適用于需要高精度時(shí)間測(cè)量的場(chǎng)景,適用于對(duì)比算法時(shí),不需要計(jì)算準(zhǔn)確時(shí)間。對(duì)于更高精度的時(shí)間測(cè)量,可以考慮使用C++11中的 <chrono>
庫,或者在Unix-like系統(tǒng)中使用 clock_gettime()
函數(shù)。
方法2:使用 <chrono> 庫(C++11及以上)
C++11引入了<chrono>
庫,它提供了高精度的時(shí)間測(cè)量功能。這個(gè)庫里面有很多函數(shù),都是與時(shí)間有關(guān)的,功能非常強(qiáng)大,下面列舉一個(gè)比較常用的函數(shù)。
函數(shù)實(shí)例:
std::chrono::system_clock::now | 獲取當(dāng)前系統(tǒng)時(shí)間的時(shí)間點(diǎn) |
std::chrono::steady_clock::now | 獲取當(dāng)前穩(wěn)定時(shí)間的時(shí)間點(diǎn) |
std::chrono::high_resolution_clock::now | 獲取當(dāng)前高分辨率時(shí)間的時(shí)間點(diǎn) |
std::chrono::time_point | 模板類,用于表示時(shí)間點(diǎn) |
std::chrono::duration | 模板類,用于表示時(shí)間間隔 |
std::chrono::system_clock::to_time_t | 將time_point 轉(zhuǎn)換為std::time_t |
std::chrono::system_clock::from_time_t | 將std::time_t 轉(zhuǎn)換為time_point |
std::put_time | 用于將時(shí)間格式化為字符串 |
std::this_thread::sleep_for | 使當(dāng)前線程睡眠一段時(shí)間 |
這個(gè)是實(shí)打?qū)嵉挠?jì)算程執(zhí)行時(shí)間的,其原理類似一個(gè)計(jì)時(shí)器,當(dāng)執(zhí)行到 auto start = std::chrono::high_resolution_clock::now();這個(gè)語句獲取一個(gè)時(shí)間,開始計(jì)時(shí)。auto end = std::chrono::high_resolution_clock::now();這個(gè)語句也是獲取一個(gè)時(shí)間,執(zhí)行完就結(jié)束計(jì)時(shí),最后,使用count()
函數(shù)以秒為單位打印出運(yùn)行時(shí)間。
代碼示例:
以下是使用<chrono>
庫計(jì)算程序執(zhí)行時(shí)間的示例代碼:
#include <iostream> #include <chrono> using namespace std; int main() { // 開始時(shí)間點(diǎn) auto start = chrono::high_resolution_clock::now(); // 要執(zhí)行的代碼 // ... // 結(jié)束時(shí)間點(diǎn) auto end = chrono::high_resolution_clock::now(); // 計(jì)算持續(xù)時(shí)間 chrono::duration<double, milli> duration = end - start; // 輸出執(zhí)行時(shí)間 cout << "程序執(zhí)行時(shí)間:" << duration.count() << "毫秒" << endl; return 0; }
方法3:使用time.h頭文件中的time()函數(shù)
time.h
是 C 語言標(biāo)準(zhǔn)庫中的一個(gè)頭文件,它提供了多種與時(shí)間相關(guān)的函數(shù)。這個(gè)time函數(shù)是C語言初學(xué)者最熟悉的一個(gè)。其中,time()
函數(shù)用于獲取當(dāng)前的日歷時(shí)間(自1970年1月1日00:00:00 UTC以來的秒數(shù))。
time.h頭文件常用函數(shù):
time():
功能:獲取當(dāng)前時(shí)間。
原型:
time_t time(time_t *tloc);
返回值:返回當(dāng)前時(shí)間(自1970年1月1日00:00:00 UTC以來的秒數(shù)),如果出錯(cuò)返回-1。
參數(shù):
tloc
是一個(gè)可選的指針,如果提供,函數(shù)會(huì)將當(dāng)前時(shí)間存儲(chǔ)在這個(gè)指針指向的位置。ctime():
- 功能:將 time_t 值轉(zhuǎn)換為本地時(shí)間的字符串表示。
- 原型:
char *ctime(const time_t *timep);
- 返回值:返回一個(gè)指向以 null 結(jié)尾的字符串的指針,該字符串表示本地時(shí)間。
localtime():
- 功能:將 time_t 值轉(zhuǎn)換為表示本地時(shí)間的 tm 結(jié)構(gòu)體。
- 原型:
struct tm *localtime(const time_t *timep);
- 返回值:返回一個(gè)指向 tm 結(jié)構(gòu)體的指針,該結(jié)構(gòu)體包含本地時(shí)間。
gmtime():
- 功能:將 time_t 值轉(zhuǎn)換為表示 UTC 時(shí)間的 tm 結(jié)構(gòu)體。
- 原型:
struct tm *gmtime(const time_t *timep);
- 返回值:返回一個(gè)指向 tm 結(jié)構(gòu)體的指針,該結(jié)構(gòu)體包含 UTC 時(shí)間。
difftime():
- 功能:計(jì)算兩個(gè) time_t 值之間的差異(以秒為單位)。
- 原型:
double difftime(time_t time1, time_t time2);
- 返回值:返回兩個(gè)時(shí)間之間的差異。
mktime():
- 功能:將 tm 結(jié)構(gòu)體轉(zhuǎn)換為 time_t 值。
- 原型:
time_t mktime(struct tm *timeptr);
- 返回值:返回表示時(shí)間的時(shí)間戳。
asctime():
- 功能:將 tm 結(jié)構(gòu)體轉(zhuǎn)換為 24 小時(shí)制的時(shí)間字符串。
- 原型:
char *asctime(const struct tm *timeptr);
- 返回值:返回一個(gè)指向以 null 結(jié)尾的字符串的指針,該字符串表示時(shí)間。
strftime():
- 功能:根據(jù)指定的格式將 time_t 或 tm 結(jié)構(gòu)體的時(shí)間格式化為字符串。
- 原型:
size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
- 返回值:返回寫入的字符數(shù)。
代碼示例:
以下是如何使用 time.h
頭文件中的 time()
函數(shù)來計(jì)算遞歸與非遞歸程序的一個(gè)簡(jiǎn)單示例:
#include<iostream> #include<time.h> using namespace std; typedef long long ll; ll n, sum=1; ll fun(int dep) {//遞歸函數(shù) if (dep == 1) { return 1; } else { return 2 * (fun(dep - 1) + 1); } } void test0() {//非遞歸直接利用數(shù)學(xué)公式推理 cin >> n; for (int i = 0; i < n-1; i++) { sum = (sum + 1) * 2; } cout << sum << endl; } void test01() { cin >> n; cout << fun(n) << endl; } int main(){ time_t start=time(NULL);//開始時(shí)間 test01();//這里填寫您測(cè)試的代碼 time_t end =time(NULL);//結(jié)束時(shí)間 double dif_time=difftime(end, start);//計(jì)算差值 cout<<dif_time<<endl; return 0; }
對(duì)于這種計(jì)算算法的執(zhí)行效率肯定是不會(huì)考的,可能在測(cè)試以及開發(fā)過程中使用,大家看看圖一樂就行。
到此這篇關(guān)于C/C++計(jì)算程序執(zhí)行時(shí)間的幾種方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C/C++計(jì)算程序執(zhí)行時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 實(shí)現(xiàn)ASP程序執(zhí)行時(shí)間統(tǒng)計(jì)類的代碼
- php set_time_limit(0) 設(shè)置程序執(zhí)行時(shí)間的函數(shù)
- 顯示程序執(zhí)行時(shí)間php函數(shù)代碼
- Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法
- php計(jì)算當(dāng)前程序執(zhí)行時(shí)間示例
- Python實(shí)現(xiàn)監(jiān)控程序執(zhí)行時(shí)間并將其寫入日志的方法
- 在IPython中進(jìn)行Python程序執(zhí)行時(shí)間的測(cè)量方法
- C#程序執(zhí)行時(shí)間長(zhǎng)查詢速度慢解決方案
- Python實(shí)現(xiàn)計(jì)算函數(shù)或程序執(zhí)行時(shí)間
相關(guān)文章
C語言判斷數(shù)是否為素?cái)?shù)與素?cái)?shù)輸出
大家好,本篇文章主要講的是C語言判斷數(shù)是否為素?cái)?shù)與素?cái)?shù)輸出,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Qt+GDAL庫實(shí)現(xiàn)制作經(jīng)緯度坐標(biāo)轉(zhuǎn)換工具
這篇文章主要為大家詳細(xì)介紹了如何利用Qt和GDAL庫實(shí)現(xiàn)制作經(jīng)緯度坐標(biāo)轉(zhuǎn)換工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04C++使用宏函數(shù)實(shí)現(xiàn)單例模板詳解
在我們?nèi)粘i_發(fā)中,無可避免需要使用單例模式進(jìn)行設(shè)計(jì)類對(duì)象。這篇文章主要介紹了如何使用宏函數(shù)實(shí)現(xiàn)單例模板,感興趣的小伙伴可以了解一下2023-02-02