[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);
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() 函式精度更高並且是執行緒安全的,因此在多執行緒中計時採用該函式是比較好的選擇。
unix時間戳(unix timestamp),或稱unix時間(unix time)、posix時間(posix time)。unix時間戳是一種時間表示方式,定義為是從epoch(2023年1月1日00:00:00 utc)開始到現在所經過的秒數。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;
協調世界時,又稱世界標準時間或世界協調時間,簡稱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日到現在的時間 或者為執行計時,也可以稱之為牆上時間。在程式執行之前獲取一次時間,執行結束之後獲取...