C 基礎 函式技巧 計時函式

2021-07-30 23:37:43 字數 4813 閱讀 8361

[c++基礎] 系列是以我在工作中的系統研發筆記為基礎加以整理推出的。該系列內容主要涉及c/c++中的基礎知識,常用函式的使用說明和技巧,討論函式在不同平台(windows和linux)、不同編譯器版本環境下的差異,指出函式使用過程中的大坑,並給出筆者在研發中常用的**示例。

本文內容主要整理自筆者的工作筆記中:關於c++時間統計部分的資料和心得。仔細對比了c++中不同時間函式的使用方式,計時準確性,多執行緒安全性等,並給出了常用的**示例。

文章小節安排如下:

1)綜述

2)clock() / clock_t

3)time() / time_t

4)gettimeofday() / struct timeval

5)clock_gettime() / struct imespec

6)補充資料

函式平台

標頭檔案多執行緒

精度clock() / clock_t

windows/linux

#include

不支援毫秒

time() / time_t

windows/linux

#include

支援(有坑)

秒gettimeofday() / struct timeval

unix/linux

#include

#include

支援微秒

clock_gettime() / struct imespec

unix/linux

#include

#include

支援納秒 -

函式平台

標頭檔案多執行緒

精度clock() / clock_t

windows/linux

#include

不支援毫秒

函式 clock() 返回值型別是clock_t,是乙個long型別,表示程序執行時間,單位是cpu時鐘計時單元(clock tick)數,或者說滴答數(ticks)。一般用兩次clock函式來計算程序自身執行的時間。

注意,

當程式單執行緒或者單核心機器執行時,這種時間的統計方法是正確的。當多執行緒併發時候clock()函式就會不準確,因為clock()將返回程序總的時鐘計時單元數量,而不是當前執行緒的。

clock_t time_start;

clock_t time_end;

time_start= clock();

// func()

time_end= clock();

// diff-second

double time_diff_sec = ((double)(time_end- time_start) / clocks_per_sec);

printf("lib: time diff: %fs.\n", time_diff_sec);

函式

平台標頭檔案

多執行緒精度

time() / time_t

windows/linux

#include

支援(有坑)

秒函式 time() 返回從 utc 1970-1-1 0:0:0 開始到現在(呼叫函式時刻)的秒數。

注意,

time_t方式在自定義多執行緒方式下沒有問題,但在某些rpc框架下(比如thrift下)計時存在問題,大坑!

如果想在thrfit的執行緒池模式下計算執行緒耗時,請使用timeval或者timespec。    

time_t time_start;

time_t time_end;

time_start = time(null);

// func()

time_end = time(null);

// diff-second

double time_diff_sec = difftime(time_end, time_start);

//print

printf("lib: start time: %s", ctime(&time_start));

printf("lib: end time: %s", ctime(&time_end));

printf("lib: time diff: %fs.\n", time_diff_sec);

函式

平台標頭檔案

多執行緒精度

gettimeofday() / struct timeval

unix/linux

#include

#include

支援微秒

函式 gettimeofday() 返回的timeval值為epoch(00:00:00 1970-01-01 utc)到建立struct timeval 時的時間,tv_sec 為秒數部分,tv_usec 為微秒數部分(10的-6次方秒)。

結構體 struct timeval 在time.h中的定義為:

struct timeval ;
struct timeval t1, t2;

gettimeofday(&t1, null);

// func()

gettimeofday(&t2, null);

// diff-second

double time_diff_sec = (t2.tv_sec-t1.tv_sec) + (t2.tv_usec-t1.tv_usec)/1000000;

函式

平台標頭檔案

多執行緒精度

clock_gettime() / struct imespec

unix/linux

#include

#include

支援納秒

函式 clock_gettime() 返回的imespec值為特定時刻到建立struct timeval 時的時間,tv_sec 為秒數部分,tv_usec 為微秒數部分(10的-9次方秒)。

結構體 struct imespec在time.h中的定義為:

struct timespec ;
常用的4時刻如下:

clock_realtime 系統當前時間(從utc1970-1-1 0:0:0算起)

clock_monotonic 系統的啟動時間

clock_process_cputime_id 本程序執行時間

clock_thread_cputime_id 本執行緒執行時間

clock_gettime() 和 gettimeofday() 函式精度更高並且是執行緒安全的,因此在多執行緒中計時採用該函式是比較好的選擇。

struct timespec t1, t2;

clock_gettime(clock_monotonic, &t1);

// func()

clock_gettime(clock_monotonic, &t2);

// diff-second

double time_diff_sec = (t2.tv_sec-t1.tv_sec) + (t2.tv_usec-t1.tv_usec)/1000000;

unix時間戳(unix timestamp),或稱unix時間(unix time)、posix時間(posix time)。unix時間戳是一種時間表示方式,定義為是從epoch(2023年1月1日00:00:00 utc)開始到現在所經過的秒數。  

協調世界時,又稱世界標準時間或世界協調時間,簡稱utc(英文「coordinated universal time」/法文「temps universel coordonné」),是最主要的世界時間標準,其以原子時秒長為基礎,在時刻上盡量接近於格林尼治標準時間。中華**採用cns 7648的《資料元及交換格式–資訊交換–日期及時間的表示法》(與iso 8601類似)稱之為世界協調時間。中華人民共和國採用iso 8601:2000的國家標準gb/t 7408-2005《資料元和交換格式 資訊交換 日期和時間表示法》中亦稱之為協調世界時。

這套時間系統被應用於許多網際網路和全球資訊網的標準中,例如,網路時間協議(ntp, network time protocol)就是協調世界時在網際網路中使用的一種方式。

utc目前來說也就是指 gmt 時間。為什麼說目前就是指 gmt 時間呢?因為本初子午線(子午線即經線,本初子午線即 0 度經線)其實穿過的是沙地阿拉伯西邊的麥加,而不是英國的格林威治。當時英國皇家學會暫時確定格林威治為本初子午線的穿過點,加之英國正是興旺發達時期,全世界就將錯就錯,用到現在。說不定哪天改為麥加時間為標準時間也不是沒有可能,所以我們一般使用 utc,而不是 gmt。

格林尼治標準時間(中國大陸翻譯:格林尼治平均時間或格林尼治標準時間,臺、港、澳翻譯:格林威治標準時間;英語:greenwich mean time,gmt)是指位於英國倫敦郊區的皇家格林尼治天文台當地的標準時間,因為本初子午線被定義為通過那裡的經線。

自2023年2月5日開始,格林尼治天文台負責每隔一小時向全世界發放調時資訊。

理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間。但由於地球在它的橢圓軌道裡的運動速度不均勻,這個時刻可能與實際的太陽時有誤差,最大誤差達16分鐘。原因在於地球每天的自轉是有些不規則的,而且正在緩慢減速,因此格林尼治時間基於天文觀測本身的缺陷,已經不再被作為標準時間使用。

utc是根據原子鐘來計算時間,現在世界上最精確的原子鐘50億年才會誤差1秒(最精確原子鐘問世:50億年誤差一秒),可以說非常精確。因此現在的標準時間採用由原子鐘報時的協調世界時(utc)來決定。

維基百科

the c++ resources network

C 程式計時函式

有時候需要對程式某個部分進行計時 上 double timecost total 0 large integer m nfreq large integer m nbegintime large integer nendtime inline void starttiming inline void...

python計時函式 python計時函式

技術文件 一屏 使用者滑動螢幕至主體內容展現結束之前,在頁面任意位置停留時看到的所有內容,稱為一屏。移動端適配 為了使pc頁面能夠在移動端正常展現的手段,保證使用者不需要縮小 放大 左右滑動即可看清全部字型。廣告 指為了某種特定的需要,通過一定形式的 公開且廣泛地向公眾傳遞資訊的宣傳手段 本 中的廣...

c 計時函式的使用

為了測試程式的效能,我們常常需要使用計時函式。在c 中提供了多種實現計時的方式。下面主要說明gettimeofday和clock函式的使用。gettimeofday獲取的是當前精確時間 1970年1月1日到現在的時間 或者為執行計時,也可以稱之為牆上時間。在程式執行之前獲取一次時間,執行結束之後獲取...