溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++怎么計(jì)算時(shí)間差

發(fā)布時(shí)間:2023-04-25 11:26:56 來源:億速云 閱讀:150 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要講解了“C++怎么計(jì)算時(shí)間差”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++怎么計(jì)算時(shí)間差”吧!

Qt計(jì)算時(shí)間的兩種方法:

  • QTime elapsed() : ms

  • QTime currentTime() : ms

C++計(jì)算時(shí)間的五種方法:

  • clock() : ms

  • GetTickCount() : ms

  • gettimeofday(time_val*, NULL) : us

  • QueryPerformanceFrequency(LARGE_INTEGER*) & QueryPerformanceCounter(LARGE_INTEGER*) : us

  • time(NULL) : s

#include <QThread>
#include <QTime>
#include <sys/time.h>   //clock, gettimeofday, time
#include <windows.h>    //Sleep, GetTickCount, timeGetTime, QueryPerformanceCounter
#include <QDebug>

//#pragma comment(lib, "winmm.lib") //timeGetTime, 但是這個(gè)庫Windows或Qt或VS2015都沒有自帶

const unsigned long SLEEP_TIME_MILL = 1000;

/**
 * QTime的精度為ms級(jí)
 */
void calcByQtimeElapsed() {
    QTime time;
    time.start();
    QThread::msleep(SLEEP_TIME_MILL);
    int timeElapsed = time.elapsed();
    qDebug()<<"QTime.start & QTime.elspsed ="<<timeElapsed<<"ms";
}

/**
 * QTime的精度為ms級(jí)
 */
void calcByQtimeCurrentTime() {
    QTime startTime = QTime::currentTime();
    QThread::msleep(SLEEP_TIME_MILL);
    QTime stopTime = QTime::currentTime();
    int elapsed = startTime.msecsTo(stopTime);
    qDebug()<<"QTime.currentTime ="<<elapsed<<"ms";
}

/**
 * clock的精度為ms級(jí)
 */
void calcByClock() {
    clock_t startTime = clock();
    Sleep(SLEEP_TIME_MILL);
    clock_t endTime = clock();
    clock_t elapsed = endTime - startTime;
    qDebug()<<"clock ="<<elapsed<<"ms";
}

/**
 * GetTickCount的精度為ms級(jí)
 */
void calcByTickCount() {
    //返回自開機(jī)以來經(jīng)歷的毫秒數(shù)
    DWORD startTime = GetTickCount();
    Sleep(SLEEP_TIME_MILL);
    DWORD stopTime = GetTickCount();
    DWORD elapsed = stopTime - startTime;
    qDebug()<<"GetTickCount = "<<elapsed<<"ms";
}

///**
// * timeGetTime的精度為ms級(jí)
// * 必須添加Winmm.lib, 否則編譯報(bào)錯(cuò)undefined reference
// */
//void calcByTimeGetTime() {
//    //返回自開機(jī)以來經(jīng)歷的毫秒數(shù)
//    DWORD startTime = timeGetTime();
//    Sleep(SLEEP_TIME_MILL);
//    DWORD stopTime = timeGetTime();
//    DWORD elapsed = stopTime - startTime;
//    qDebug()<<"timeGetTime = "<<elapsed<<"ms";
//}

/**
 * gettimeofday的精度為us級(jí)
 */
void calcByGetTimeOfDay() {
    struct timeval startTime, stopTime;
    gettimeofday(&startTime, NULL);
    Sleep(SLEEP_TIME_MILL);
    gettimeofday(&stopTime, NULL);
    long elapsed = (stopTime.tv_sec-startTime.tv_sec) * 1000000 + (stopTime.tv_usec - startTime.tv_usec);
    qDebug()<<"gettimeofday ="<<elapsed<<"us";
}

/**
 * QueryPerformanceCounter的精度為us級(jí)
 */
void calcByQueryPerformanceCounter() {
    LARGE_INTEGER frequency, startCount, stopCount;
    WINBOOL ret;
    //返回性能計(jì)數(shù)器每秒滴答的個(gè)數(shù)
    ret = QueryPerformanceFrequency(&frequency);
    if(ret) {
        ret = QueryPerformanceCounter(&startCount);
    }
    Sleep(SLEEP_TIME_MILL);
    if(ret) {
        QueryPerformanceCounter(&stopCount);
    }
    if(ret) {
        LONGLONG elapsed = (stopCount.QuadPart - startCount.QuadPart) * 1000000 / frequency.QuadPart;
        qDebug()<<"QueryPerformanceFrequency & QueryPerformanceCounter ="<<elapsed<<"us";
    }
}

/**
 * time(NULL)精確度為s級(jí)
 */
void calcByTime() {
    time_t startTime = time(NULL);
    Sleep(SLEEP_TIME_MILL);
    time_t stopTime = time(NULL);
    long elapsed = stopTime - startTime;
    qDebug()<<"time(NULL) ="<<elapsed<<"s";
}

int main(int argc, char *argv[])
{
    calcByQtimeElapsed();
    calcByQtimeCurrentTime();
    calcByClock();
    calcByTickCount();
//    calcByTimeGetTime();
    calcByGetTimeOfDay();
    calcByQueryPerformanceCounter();
    calcByTime();
    system("pause");
    return 0;
}

C++怎么計(jì)算時(shí)間差

感謝各位的閱讀,以上就是“C++怎么計(jì)算時(shí)間差”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C++怎么計(jì)算時(shí)間差這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI