C 14系列(2) C C 的時間函式

2021-07-04 14:13:19 字數 3438 閱讀 4109

為了好好研究下c++14,順便複習下以前的c++知識。搞了個git(不斷完善中):

裡面會慢慢封裝一些常用的函式,並做一些測試驗證,工程是建立在ubuntu的eclipse之上,見系列(1)環境搭建。

參考:

時間函式常用到的幾個概念:calendar time(日曆時間),epoch(時間點),clock tick(時鐘計時單元)coordinated universal time(utc):世界標準時間,即格林威治標準時間(greenwich mean time,gmt)。

epoch:時間點。在標準c/c++中是乙個整數,它用當前的時間和標準時間點的相差秒數來表示。它可以理解成日曆時間,因為它已經是乙個差值了。

日曆時間(calendar time),是用「從乙個標準時間點到此時的時間經過的秒數」來表示的時間。

clock tick:時鐘計時單元,乙個時鐘計時單元的時間長短是由cpu控制的。乙個clock tick不是cpu的乙個時鐘週期,而是c/c++的乙個基本計時單位。

c/c++中的cpu使用計時函式是clock(),而與其相關的資料型別是clock_t。這個函式返回從「開啟這個程式程序」到「程式中呼叫clock()函式」時之間的cpu時鐘計時單元(clock tick)數,其中clock_t是用來儲存時間的資料型別。

clock_t是乙個長整形數。在time.h檔案中,還定義了乙個常量clocks_per_sec,它用來表示一秒鐘會有多少個時鐘計時單元,如下列印的是程序執行至今占用的cpu時間秒數,並且它是算單核的秒數,如果這個程式是多執行緒的,core1和core2同時被某程式的兩個執行緒使用了5s的cpu執行時間片,那麼此時列印的應該是10s(已經驗證)。

printf("elapsed time:%u secs.\n",clock()/clocks_per_sec);
在c/c++中通過 < time.h > 裡的time函式獲得日曆時間。日曆時間(calendar time)是通過time_t資料型別來表示的,用time_t表示的時間(日曆時間)是從乙個時間點(例如:2023年1月1日0時0分0秒)到此時的秒數。time_t實際上是長整型。

用time()函式結合其他函式(如:localtime、gmtime、asctime、ctime)可以獲得當前系統時間或是標準時間。

time_t time(time_t * timer);
在標準c/c++中,我們可通過tm結構來獲得日期,tm結構在time.h中有定義,相當於乙個包含了年月日小時分鐘等的結構體。

ansi c標準稱使用tm結構的這種時間表示為分解時間(broken-down time)。

而日曆時間(calendar time)是從乙個時間點到此時的秒數,型別比較簡單。

在time.h標頭檔案中,我們還可以看到一些函式,它們都是以time_t為引數型別或返回值型別的函式:

double

difftime(time_t time1, time_t time0);

time_t mktime(struct tm * timeptr);

time_t time(time_t * timer);

char * asctime(const struct tm * timeptr);

char * ctime(const time_t *timer);

此外,time.h還提供了兩種不同的函式將日曆時間(乙個用time_t表示的整數)轉換為我們平時看到的把年月日時分秒分開顯示的時間格式tm:

struct tm * gmtime(const time_t *timer);                                          

struct tm * localtime(const time_t * timer);

使用函式:

char * asctime(const

struct tm * timeptr);

char * ctime(const time_t *timer);

列印結果:

例如 wed jan 02 02:03:55 1980\n\0

其中asctime()函式是通過tm結構來生成字串,所以可以傳給世界時間或者本地時間,而ctime()是通過日曆時間來生成字串。ctime()函式需要先參照本地的時間設定,把日曆時間轉化為本地時間,然後再生成格式化後的字串。所以一般其列印的是本地時間字串。

使用strftime()函式將時間格式化為想要的格式。它的原型如下:

size_t strftime(

char *strdest,

size_t maxsize,

const

char *format,

const

struct tm *timeptr

);

例子:

strftime(str,100,"it is now %i

%p",ptr);

printf(str);

其執行結果為:

it is now 4pm

例子:

strftime( tmpbuf, 128, "today is %a, day %d of %b in the year %y.\n", newtime);

printf(tmpbuf);

執行結果:

today is saturday, day 30 of july in the year 2005.

分解時間,在c/c++中指tm結構。我們可以使用mktime()函式將tm結構轉化為日曆時間。其函式原型如下:

time_t mktime(struct tm * timeptr);
除了上述的標準c/c++用到的時間函式外,linux系統也提供了乙個函式,可以精確到微秒。

這就是gettimeofday函式,它獲得的時間精確到微秒(1e-6 s)量級。在一段**前後分別使用如下:

struct timeval tv_begin, tv_end;

gettimeofday(&tv_begin, null);

foo();

gettimeofday(&tv_end, null);

結構體timeval的定義為:

struct timeval
time只能返回秒級的返回值,而該結構體能精確到微秒級。

該函式和time函式一樣都是按真實世界的時間來計算的。

本文介紹了c/c++中的有關日期和時間的概念,並通過各種例項講述了這些函式和資料結構的使用方法。如果要測試優化的程式的執行效率,一般測量程序在cpu上使用的時間片之和,可以用clock函式,clock函式並不代表真實世界的時間。真實世界的時間則是time或者gettimeofday函式得到的,它們也可以用於日期的顯示。

2 c c 中的保留小數問題

一,不強制型別轉換時 是否可以輸出非零小數問題 結果變數定義為int型,此時無論參與運算的變數是什麼型都不能輸出非零小數。結果為double型,參與運算的變數為int型,此時也是只能輸出0。都為double型,但實際參與運算值是整數,此時可以輸出非零小數。參與運算的不是變數名,而是直接數字的運算。例...

C 14學習筆記 2 函式返回型別推導

雖然普通函式不能使用auto形參,但可以使用返回型別推導。在c 11中我們可以使用後置返回型別推導來完成這件事情 2.1 c 11中使用後置返回型別推導 auto add int x,int y decltype x y 而在c 14中,我們可以省略decltype,編譯器直接由return語句的值...

Eclipse的C 14支援配置

當前ubuntu的lts版本號為14.04,直接在apt get命令安裝的g 到不了5.0版本號,不能獲得所有的c 14的支援。所以必須安裝5.0以上版本號的g 這裡的方法例如以下 sudo add apt repository ppa ubuntu toolchain r test sudo ap...