2012-07-20 34 views
2

我正在研究一個項目,我需要比整個秒(即time())更精細的粒度。我正在瀏覽opengroup.org,我注意到有數據結構與成員tv_usec和tv_nsec。[milli |微| |納秒]粒度使用tv_usec或tv_nsec

#include <stdio.h> 
#include <time.h> 

int main (void) { 
     struct timespec ts; 
     clock_gettime(CLOCK_REALTIME, &ts); 
     printf("%lis %lins\n", ts.tv_sec, ts.tv_nsec); 

     return 0; 
} 


test.cpp(5) : error C2079: 'ts' uses undefined struct 'main::timespec' 
test.cpp(6) : error C2065: 'CLOCK_REALTIME' : undeclared identifier 
test.cpp(6) : error C3861: 'clock_gettime': identifier not found 

是否有一種簡單的方法通過使用標準庫獲得高精度時間值?我實際上並不需要很高的準確度,但我確實需要增加相對時間。

+0

你正在使用什麼操作系統? – 2012-07-20 22:57:39

+0

在這裏編譯...這是POSIX系統..你使用Windows或其他東西? – 2012-07-20 23:03:34

+0

是的,不幸的是我使用Windows ... – Zak 2012-07-21 01:51:22

回答

1

感謝大家誰給了一個答案,這裏是Windows相當於LINUX/UNIX回答...

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

int main (void) { 
SYSTEMTIME st; 
GetSystemTime(&st); 
printf("%lis %lins\n", st.wSecond, st.wMilliseconds); 

return 0; 
} 

編輯:您可能還想檢查GetTickCount(),但我認爲它是以CPU的成本。

5

在C++ 11中,#include <chrono>和使用std::chrono::high_resolution_clock(也可從Boost獲得)。

在Posix中,您可以使用gettimeofday獲取微秒時間戳,或者使用clock_gettime獲取納秒分辨率。

+1

[Boost.Chrono](http://www.boost.org/libs/chrono/)。 – Xeo 2012-07-20 23:03:33

+0

@Xeo:謝謝 - 更新! – 2012-07-20 23:06:22

1

看看我爲分析編寫的以下代碼。你會在Linux環境中找到ns時間戳的調用。對於另一個環境中,您可能需要更換CLOCK_MONOTONIC

#ifndef PROFILER_H 
#define PROFILER_H 

#include <sys/time.h> 
#include <QString> 

class Profiler 
{ 
    public: 
    Profiler(QString const& name); 
    long measure() const; 

    long measureNs() const; 
    double measureMs() const; 
    double measureS() const; 
    void printNs() const; 
    void printMs() const; 
    void printS() const; 
    private: 
    QString mName; 
    timespec mTime; 
}; 

#endif // PROFILER_H 

#include "profiler.h" 
#include <QDebug> 
#include <assert.h> 
#include <iostream> 

Profiler::Profiler(QString const& name):mName(name){ 
    clock_gettime(CLOCK_MONOTONIC, &mTime); // Works on Linux 
} 


long int Profiler::measureNs() const{ 
    timespec end; 
    clock_gettime(CLOCK_MONOTONIC, &end); // Works on Linux 
    long int diff = (end.tv_sec-mTime.tv_sec) * 1000000000 + (end.tv_nsec - mTime.tv_nsec); 
    assert(diff>0); 
    return diff; 
} 

double Profiler::measureMs() const{ 
    return measureNs()/1000000.0; 
} 

double Profiler::measureS() const{ 
    return measureMs()/1000.0; 
} 

void Profiler::printNs() const{ 
    qDebug() << mName << "Time elapsed:" << measureNs() << "ns"; 
} 

void Profiler::printMs() const{ 
    qDebug() << mName << "Time elapsed:" << measureMs() << "ms"; 
} 

void Profiler::printS() const{ 
    qDebug() << mName << "Time elapsed:" << measureS() << "S"; 
}