2010-07-19 3 views
9

프로그램 실행 후 밀리 초 수를 추적하기 위해 C++에서 어떤 방법이 필요합니다. 그리고 정밀도는 밀리 초가되어야합니다. (내 인터넷 검색, 난 time.h을 포함하고이 작동하지 않습니다 ... 1000 time()의 출력을 곱 말했다 사람들을 많이 발견했습니다.)C++ 일부 날짜 이후로 밀리 초 가져 오기

+3

; 나는 이걸 휴대 할 수있는 방법이 없다고 확신합니다. –

+0

시간이 그렇게 보입니다.아래의 h clock() 솔루션은 잘 작동합니다. 여기에 제가 생각하지 못한 문제가 있습니까? – JnBrymn

+0

글쎄, 나는 개인적으로 clock()을 사용하여 오일러 문제를 해결하는데 얼마나 오랜 시간이 걸리는지 볼 수있다. 그것은 내 경우에는 완벽하기 때문에 당신이 원하는 구체적인 방법에 달려있다. –

답변

1

std::clock()      

+2

그 링크에서 샘플 프로그램, 특히 while 루프를 좋아합니다. – corsiKa

+1

CLOCKS_PER_SEC은 밀리 초 단위로 보장되지 않습니다. –

+0

예, OS에 따라 다릅니다. – cpx

0
을 참조하십시오

이 C++ 특정 (도 휴대용)가 아니라 당신이 할 수 있습니다

SYSTEMTIME systemDT; 

를 윈도우에서.

거기에서 시스템의 각 구성원에게 액세스 할 수 있습니다.

프로그램을 시작한 시간을 기록하고 현재 시간과 기록 된 시간을 비교할 수 있습니다 (예 : 에 대한 systemDT).

systemDT.wHour, systemDT.wMinute, systemDT.wMilliseconds을 할 것입니다, 당신은 각 구성원에 액세스하려면 GetLocalTime(&systemDT);

를 호출 할 수 있습니다, 새로 고침합니다.

SYSTEMTIME에 대한 자세한 정보를 얻으려면.

1

time.h를 포함하고 clock() 함수를 사용하십시오. 프로그램 시작 후 경과 된 시계 틱 수를 반환합니다. "CLOCKS_PER_SEC"로 나누어 초 수를 얻으면 1000을 곱하여 밀리 초 수를 구할 수 있습니다.

+2

확실히 1000을 곱하는 것을 의미합니까? – Stephen

+0

질문 : 그는 1000 솔루션으로 나눗셈이 아니라 정밀도가 필요하다고 말했다 :) – anijhaw

+0

나는 곱셈 btw를 의미 : P – anijhaw

1

일부 크로스 플랫폼 솔루션. 이 코드는 일종의 벤치마킹에 사용되었습니다.

#ifdef WIN32 
    LARGE_INTEGER g_llFrequency = {0}; 
    BOOL g_bQueryResult = QueryPerformanceFrequency(&g_llFrequency); 
#endif 

//... 

long long osQueryPerfomance() 
{ 
#ifdef WIN32 
    LARGE_INTEGER llPerf = {0}; 
    QueryPerformanceCounter(&llPerf); 
    return llPerf.QuadPart * 1000ll/(g_llFrequency.QuadPart/1000ll); 
#else 
    struct timeval stTimeVal; 
    gettimeofday(&stTimeVal, NULL); 
    return stTimeVal.tv_sec * 1000000ll + stTimeVal.tv_usec; 
#endif 
} 
+0

gettimeofday()는 Windows에서 지원되지 않습니다. Windows에서 코드를 컴파일하는 동안 QueryPerformanceCounter가 사용됩니다. 고해상도 타이머가 아닙니다. 이 방법은 매우 빠르고 정확합니다. – loentar

0

벽시계 시간, CPU 시간 또는 다른 측정을 원하십니까? 또한 어떤 플랫폼입니까?

대부분의 유닉스 시스템에
  • , 당신은 적어도 마이크로 정밀도와 액세스를 제공 gettimeofday() 및/또는 clock_gettime()을 사용할 수 있습니다 ...이 time()clock()는 당신을 줄 것보다 더 많은 정밀도를 얻을 수있는 보편적 휴대용 방법은 없지만, 다양한 타이머;
  • 저는 Windows에 익숙하지 않지만, these functions 중 하나는 아마도 당신이 원하는대로 할 것입니다.
1

가장 이식성이 시계 function.It를 사용하는 보통 프로그램 프로세서, 또는 그 근사값을 이용하여 한 시간을보고한다. 그러나 다음에 유의하십시오 :

  • 해상도는 GNU 시스템에는 그리 좋지 않습니다. 정말 동정이야.

  • 부서 및 지정을 수행하기 전에 모든 것을 으로 주조하십시오.

  • 카운터는 GNU 32 비트에서 32 비트 숫자로 유지됩니다.이 값은 장시간 실행되는 프로그램의 경우 매우 귀찮을 수 있습니다.

"벽 시간"을 사용하는 대안으로 Windows 및 Linux에서 더 좋은 해상도를 얻을 수 있습니다. 그러나 libc 매뉴얼에서 알 수 있듯이 : 프로그램을 최적화하거나 효율을 측정하려는 경우, 얼마나 많은 프로세서 시간을 사용하는지 알고 있으면 매우 유용합니다. 프로세스가 입출력을 기다리거나 다른 프로세스가 CPU를 사용하기 위해 시간을 소비 할 수 있기 때문에 달력 시간과 경과 시간은 쓸모가 없습니다.

8

clock은 여러 번 제안되었습니다. 여기에는 두 가지 문제가 있습니다. 우선, 밀리 초 (10-20 밀리 초 정도)의 해상도가없는 경우가 많습니다. 둘째, 일부 구현 (예 : Unix 및 유사)은 CPU 시간을 반환하지만 일부는 (예 : Windows) 벽 시간을 반환합니다.

정말 벽에 걸리는 시간과 CPU 시간을 원하느냐고 묻지 않았으므로 정말 좋은 대답을하기가 어렵습니다. Windows에서는 GetProcessTimes을 사용할 수 있습니다. 그러면 커널과 사용자 CPU 시간을 직접 줄 수 있습니다. 또한 프로세스가 생성 된 시점을 알려주므로 프로세스 생성 후 월 시간을 원하는 경우 현재 시간 (GetSystemTime)에서 프로세스 생성 시간을 뺄 수 있습니다. QueryPerformanceCounter도 언급되었습니다. 이것은 약간의 차이가 있습니다. 예를 들어 일부 구현에서는 CPU주기 카운터에서 시간을 검색하므로 CPU 속도가 변경 될 때/그 빈도가 달라집니다. 이 아닌 마더 보드의 1.024MHz 타이머에서 읽은 다른 구현은이 아닌 CPU 속도 (및 각 조건이 완전히 사용되지 않는 조건)에 따라 다릅니다.

유닉스에서 비교적 높은 정밀도 (적어도 가능성)가있는 벽 시간을 얻으려면 GetTimeOfDay을 사용할 수 있습니다. 프로세스 시간을 원할 경우 times 또는 getrusage을 사용할 수 있습니다 (후자는 더 새롭고보다 정확한 정보를 제공합니다).

결론 : 내 의견에 말했듯이, 당신이 원하는 것을 얻는 방법은 없습니다. 특정 시스템에 대해서도 CPU 시간 또는 벽 시간을 원한다고 말하지 않았기 때문에 정답은 하나도 없습니다. 귀하가 "수락"한 (clock()) 것은 본질적으로 모든 시스템에서 의 미덕을 가지고 있지만 그 결과는 가장 광범위하게 변합니다.

+0

그는 벽 시간도 cpu 시간도 아닌 시간 델타를 원합니다. –

+0

그가 정말로해야 할 일은 단순히 프로그램이 시작될 때와 그가 얼마나 오래 실행되었는지를 알아야 할 때를 기록하는 것입니다. 현재 시간을 다시 얻고 두 값을 빼면됩니다. 그것은 당신이 얻을 수있는만큼 정확하게 될 것입니다. –

+0

@Caspin : 우선, 그의 질문이 어떤 확실성을 가진 델타라고 말할만큼 충분히 명확한가 아닌지 질문합니다. 둘째 델타 임에도 불구하고 벽이나 CPU 시간의 델타 (즉, "프로세스가 시작된 이후의 시간"또는 "프로세스에 사용 된 CPU 시간은 얼마나됩니까?") –

1

여기에 C++ 0x 솔루션과 clock()이 생각하는대로 작동하지 않을 수있는 예가 나와 있습니다.

내 시스템에서
#include <chrono> 
#include <iostream> 
#include <cstdlib> 
#include <ctime> 

int main() 
{ 
    auto start1 = std::chrono::monotonic_clock::now(); 
    auto start2 = std::clock(); 

    sleep(1); 

    for(int i=0; i<100000000; ++i); 

    auto end1 = std::chrono::monotonic_clock::now(); 
    auto end2 = std::clock(); 

    auto delta1 = end1-start1; 
    auto delta2 = end2-start2; 

    std::cout << "chrono: " << std::chrono::duration_cast<std::chrono::duration<float>>(delta1).count() << std::endl; 

    std::cout << "clock: " << static_cast<float>(delta2)/CLOCKS_PER_SEC << std::endl; 
} 

이 출력 :

chrono: 1.36839 
clock: 0.36 

당신은 clock() 방법은 두 번째 누락 알 수 있습니다. 또한 숙달 된 관찰자는 clock()이 해상도가 떨어지는 것처럼 보일 수 있습니다. 내 시스템에서는 12 밀리 초 씩 증가합니다.

C++ 0x를 사용할 수 없거나 사용하지 않으려면 Boost.DateTimeptime microsec_clock::universal_time()을 살펴보십시오.

0

당신이 코드를 시도 할 수 있습니다 (건어 체스 엔진 소스 코드 (GPL)에서 얻을) : 우리가 관심있는 OS를 알아야합니다 생각

#include <iostream> 
#include <stdio> 

#if !defined(_WIN32) && !defined(_WIN64) // Linux - Unix 
    # include <sys/time.h> 
    typedef timeval sys_time_t; 
    inline void system_time(sys_time_t* t) { 
     gettimeofday(t, NULL); 
    } 
    inline long long time_to_msec(const sys_time_t& t) { 
     return t.tv_sec * 1000LL + t.tv_usec/1000; 
    } 
    #else // Windows and MinGW 
    # include <sys/timeb.h> 
    typedef _timeb sys_time_t; 
    inline void system_time(sys_time_t* t) { _ftime(t); } 
    inline long long time_to_msec(const sys_time_t& t) { 
     return t.time * 1000LL + t.millitm; 
    } 
#endif 

struct Time { 
    void restart() { system_time(&t); } 
    uint64_t msec() const { return time_to_msec(t); } 
    long long elapsed() const { 
     return long long(current_time().msec() - time_to_msec(t)); 
    } 
    static Time current_time() { Time t; t.restart(); return t; } 
private: 
    sys_time_t t; 
}; 

int main() { 
    sys_time_t t; 
    system_time(&t); 
    long long currentTimeMs = time_to_msec(t); 
    std::cout << "currentTimeMs:" << currentTimeMs << std::endl; 

    Time time = Time::current_time(); 
    for (int i = 0; i < 1000000; i++) { 
     //Do something 
    } 
    long long e = time.elapsed(); 
    std::cout << "time elapsed:" << e << std::endl; 

    getchar(); // wait for keyboard input 
} 
관련 문제