C++計(jì)時(shí)

前言

在做視頻編碼的時(shí)候纵刘,之前有一個(gè)求圖像二維熵的函數(shù)是簡(jiǎn)單粗暴的利用數(shù)組來(lái)統(tǒng)計(jì)頻率的腻豌,感覺(jué)遍歷一個(gè)256*256的數(shù)組時(shí)間蠻長(zhǎng)的引谜,后面用map重寫了下,發(fā)現(xiàn)沒(méi)有減少什么時(shí)間疮茄,所以想精確的看看兩次代碼時(shí)間的差異滥朱,故學(xué)習(xí)下C++計(jì)時(shí)。

常規(guī)計(jì)時(shí)

  • time()
    函數(shù)名:time
    頭文件:time.h
    函數(shù)原型:time_t time(time_t *timer)
    功能:獲取當(dāng)前的時(shí)間力试,返回的是一個(gè)time_t類型焚虱,即一個(gè)long int ,實(shí)際上懂版,再time.h里定義了time_t是這樣的:

typedef long time_t

返回的整數(shù)表示從CUT時(shí)間到當(dāng)前的秒數(shù)鹃栽,然后可以計(jì)時(shí),但是這個(gè)太不準(zhǔn)確躯畴,精度太低民鼓,故跳過(guò)。

  • GetTickCount()
    函數(shù)原型: DWORD GetTickCount(void)
    功能:它返回一個(gè)DWORD類型的數(shù)據(jù)蓬抄,32位丰嘉,是操作系統(tǒng)啟動(dòng)到當(dāng)前的毫秒數(shù),值得注意的是嚷缭,它不是實(shí)時(shí)的發(fā)送饮亏,而是由系統(tǒng)每18ms發(fā)送一次耍贾,因此精度為18ms,故不滿足需求(實(shí)際上再測(cè)試的時(shí)候也發(fā)現(xiàn)這一點(diǎn)了路幸,精度為18ms,實(shí)際上操作一個(gè)10000的數(shù)組時(shí)間很短荐开,18ms精度毫無(wú)意義)
#include "stdafx.h"
#include<Windows.h>
#include<iostream>
using namespace std;
#define LEN 100000

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD tick = ::GetTickCount();
    int tick1 = tick;
    int data[LEN];
    int i = 0;
    for(i = 0;i<LEN;i++)
    {
        data[i] = i*i;
    }
    for(i = 0;i<LEN;i++)
    {
        data[i] = i*i;
    }
    for(i = 0;i<LEN;i++)
    {
        data[i] = i*i;
    }
    for(i = 0;i<LEN;i++)
    {
        data[i] = i*i;
    }
    for(i = 0;i<LEN;i++)
    {
        data[i] = i*i;
    }
    //這些循環(huán)基本上不會(huì)耗時(shí)18ms,故加入打印函數(shù)兩個(gè)tick才有顯示出差異
    for(i = 0;i<50;i++)
    {
        cout<<data[i]<<"  ";
    }
    
    DWORD tick2 = ::GetTickCount();
    cout<<"tick1 is : "<<tick<<endl;
    cout<<"tick2 is : "<<tick2<<endl;
    return 0;
}

還有clock()函數(shù)等,但是精度較低就不考慮了

#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
#define LEN 100000

int main()
{
    long j = 1000000L;
    clock_t st,end;
    st = clock();
    //while(j--);
    int data[LEN];
    int i = 0;
    for(i = 0;i<LEN;i++)
    {
        data[i] = i*i;
    }
    end = clock();
    cout<<st<<"   "<<end;
    return 0;
}
//實(shí)際上简肴,在我的測(cè)試中晃听,操作一個(gè)100000的數(shù)組用時(shí)不需要1ms
//C++的效率比python高太多了,clock()函數(shù)的精度為1ms

使用CPU時(shí)間戳

在Intel Pentium以上級(jí)別的CPU中,提供了一條機(jī)器指令RDTSC(read time stamp counter)來(lái)讀取這個(gè)時(shí)間戳的數(shù)字砰识,記錄的是CPU上電以來(lái)經(jīng)過(guò)的時(shí)鐘周期數(shù)能扒,這個(gè)數(shù)字是保存在EDX:EAX寄存器中,可通過(guò)GetCycleCount()函數(shù)來(lái)獲取辫狼,實(shí)際上GetCycleCount函數(shù)是在KTimer.h封裝好的初斑,應(yīng)該是《Windows圖形編程》,否則很難直接操作膨处,但是我沒(méi)有找到這個(gè)庫(kù)越平,故另尋他法。
后面找到了一個(gè)計(jì)時(shí)的QueryPerformanceCounter灵迫,它也可以實(shí)現(xiàn)高精度的計(jì)時(shí)。
QueryPerformanceCounter返回的是計(jì)數(shù)值
QueryPerformanceFrequency返回的是計(jì)時(shí)的頻率
那么我們可以通過(guò)時(shí)間差除以頻率來(lái)獲得高精度的時(shí)間晦溪,精度取決于計(jì)時(shí)器的頻率瀑粥,

#include <windows.h>; 
#include <stdio.h>; 

int main() 
{ 
    int i =10000;
    LARGE_INTEGER t1, t2, tc; 
    //獲取當(dāng)前計(jì)時(shí)器的頻率
    QueryPerformanceFrequency(&tc); 
    printf("Frequency: %u\n", tc.QuadPart); 
    QueryPerformanceCounter(&t1); 
    while(i--); 
    QueryPerformanceCounter(&t2); 
    printf("Begin Time: %u\n", t1.QuadPart); 
    printf("End Time: %u\n", t2.QuadPart); 
    printf("Lasting Time: %u\n",( t2.QuadPart- t1.QuadPart)); 
    return 0;
} 
result: 
Frequency: 10000000
Begin Time: 2586876488
End Time: 2586876632
Lasting Time: 144
//14.4us微秒
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市三圆,隨后出現(xiàn)的幾起案子狞换,更是在濱河造成了極大的恐慌,老刑警劉巖舟肉,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件修噪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡路媚,警方通過(guò)查閱死者的電腦和手機(jī)黄琼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門祷杈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胸墙,“玉大人震鹉,你說(shuō)我怎么就攤上這事瑟枫】某保” “怎么了询筏?”我有些...
    開(kāi)封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵绵脯,是天一觀的道長(zhǎng)渊迁。 經(jīng)常有香客問(wèn)我拧揽,道長(zhǎng)剃盾,這世上最難降的妖魔是什么腺占? 我笑而不...
    開(kāi)封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮痒谴,結(jié)果婚禮上衰伯,老公的妹妹穿的比我還像新娘。我一直安慰自己闰歪,他們只是感情好嚎研,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著库倘,像睡著了一般临扮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上教翩,一...
    開(kāi)封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天杆勇,我揣著相機(jī)與錄音,去河邊找鬼饱亿。 笑死蚜退,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彪笼。 我是一名探鬼主播钻注,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼配猫!你這毒婦竟也來(lái)了幅恋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泵肄,失蹤者是張志新(化名)和其女友劉穎捆交,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腐巢,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡品追,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冯丙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肉瓦。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胃惜,靈堂內(nèi)的尸體忽然破棺而出风宁,到底是詐尸還是另有隱情,我是刑警寧澤蛹疯,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布戒财,位于F島的核電站,受9級(jí)特大地震影響捺弦,放射性物質(zhì)發(fā)生泄漏饮寞。R本人自食惡果不足惜孝扛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幽崩。 院中可真熱鬧苦始,春花似錦、人聲如沸慌申。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹄溉。三九已至咨油,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柒爵,已是汗流浹背役电。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棉胀,地道東北人法瑟。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像唁奢,于是被迫代替她去往敵國(guó)和親霎挟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容