2010-04-29 2 views
9

기본적으로 getTickCount() 윈도우 함수를 재구성하여 기본 C++에서 비표준 라이브러리 또는 STL없이 사용할 수 있습니다. 내가기본 C++에서 시스템 틱 수 얻기?

시계()

의 현지

시간

하지만 난 살펴 보았다

(그래서 안드로이드 NDK와 함께 제공되는 라이브러리를 준수합니다) 시간 라이브러리와 함께 getTickCount 윈도우 함수를 복제 할 수 있는지 여부는 여전히 확실하지 않습니다.

누구나 올바른 방향으로이 작업을 수행 할 수 있는지 또는 가능한지 알려줄 수 있습니까?

내가하고 싶은 것을 개요 : 나는 응용 프로그램이 특정 기능을 "하고"된 시간을 계산 할 수있게하려면

.

그래서 예를 들어 나는 어플은 안드로이드 기반 리눅스에서 실행 창에서 포트 그것을 시도하고 서버

에 등록하려 시도 된 시간을 계산 할 수 있도록하려면, 여기에 창입니다 코드 :


int TimeoutTimer::GetSpentTime() const 
{ 
if (m_On) 
{ 
    if (m_Freq>1) 
    { 
     unsigned int now; 
     QueryPerformanceCounter((int*)&now); 
     return (int)((1000*(now-m_Start))/m_Freq); 
    } 
    else 
    { 
     return (GetTickCount()-(int)m_Start); 
    } 
} 
return -1; 
} 
+0

무엇을 달성하려고합니까? 그것을 할 수있는 방법이있을 수 있습니다. 아마도 한 발 뒤로 물러나서 일반적인 문제를 설명하십시오. – Tim

+0

좋은 아이디어, 응용 프로그램이 특정 기능을 "수행하고있는"기간을 계산할 수 있기를 원합니다. 그래서 예를 들어, 응용 프로그램이 서버에 등록하려고 시도한 시간을 계산할 수 있기를 원합니다. –

+0

이 경우 경과 시간을 알아낼 수있는 객체를 찾거나 만드는 것이 매우 쉽습니다. 스레드/예약 시간 또는 전체 시계/월 시간을 찾고 있습니까? – Tim

답변

18

Android NDK에서는 libc의 일부인 POSIX clock_gettime() 호출을 사용할 수 있습니다. 이 함수는 다양한 Android 타이머 호출이 끝나는 곳입니다. 예를 들어

, java.lang.System.nanoTime는()로 구현됩니다

struct timespec now; 
clock_gettime(CLOCK_MONOTONIC, &now); 
return (u8)now.tv_sec*1000000000LL + now.tv_nsec; 

이 예는 기간을 계산할 때 당신이 원하는 어떤 단조 시계를 사용합니다. 벽 시계 (gettimeofday()를 통해 사용 가능)와 달리, 네트워크 공급자가 장치의 시계를 변경하면 앞으로 또는 뒤로 건너 뛰지 않습니다.

clock_gettime()에 대한 Linux 매뉴얼 페이지는 스레드 당 경과 된 CPU 시간과 같이 사용 가능한 다른 클럭을 설명합니다.

1

그것은 불가능합니다. C++ 표준과 결과적으로 표준 라이브러리는 프로세서 나 '진드기'에 대해 아무것도 모릅니다. 이것은 스레딩 지원으로 C++ 0x에서 변경 될 수도 있고 변경되지 않을 수도 있지만, 적어도 현재로서는 불가능합니다.

1

Android에서 vblank 인터럽트 기능 (또는 hblank)에 액세스 할 수 있습니까? 그렇다면 타이머를 위해 전역의 휘발성 변수를 증가시킵니다.

3

이것은 플랫폼에 따라 다르므로 래퍼를 작성하고 각 플랫폼에 대한 구체적인 사항을 구현하기 만하면됩니다.

+0

안드로이드에 대해서만 아주 기본적인 C 라이브러리가 제공됩니다, 당신은 여기에 C 라이브러리에서 무엇을 볼 수 있습니다 - http://www.cplusplus.com/reference/clibrary/, –

+1

C 라이브러리는 time.h를 사용할 수 없습니까?그것은 당신에게 시간의 큰 해결책을주지는 않지만, 당신의 필요에 충분해야합니다. 경과 시간을 얻으려면 CLOCKS_PER_SEC과 함께 clock()을 사용하십시오. – daramarak

+0

@daramarak clock()은 시스템 시간이 아닌 프로세스 시간을 반환합니다. – darron

9

clock()은 Windows의 GetTickCount()과 매우 비슷합니다. 단위는 다를 수 있습니다. GetTickCount()은 밀리 초를 반환합니다. clock()은 초당 틱수가 CLOCKS_PER_SEC입니다. 두 가지 모두 최대 롤오버가 있습니다 (Windows의 경우 약 49.7 일).

GetTickCount()은 OS 시작시 시작됩니다. 문서에서 보면 프로세스가 시작될 때 clock()이 시작됩니다. 따라서 프로세스 간 시간을 GetTickCount()으로 비교할 수 있지만 clock()으로는 처리 할 수 ​​없습니다.

것은 당신이 하나의 프로세스 내에서 일어나고 얼마나 오래 뭔가 계산하기 위해 노력하고, 당신은 롤오버에 대해 걱정하지 않은 경우 :

const clock_t start = clock(); 
// do stuff here 
clock_t now = clock(); 
clock_t delta = now - start; 
double seconds_elapsed = static_cast<double>(delta)/CLOCKS_PER_SEC; 

명확한 설명 :는 여부의 불확실성이있는 것 같습니다 clock()은 경과 된 벽 시간 또는 프로세서 시간을 반환합니다. 내가 조사한 첫 번째 여러 참고 문헌은 벽 시간을 말합니다.예를 들면 :

틀림없이 조금 모호 Returns the number of clock ticks elapsed since the program was launched.

.

The elapsed wall-clock time since the start of the process....

사용자 darron이 깊이 파고 나에게 확신, 그래서는 C 표준 (ISO/IEC 9899 : TC2)의 초안 사본을 발견 MSDN 더 명시 적이며, 그것은 말한다 :

... 는 사용 프로세서 시간에 대한 구현의 가장 근사치를 ... 반환

필자가 사용한 모든 구현은 월 클럭 시간을 제공한다고 생각합니다 (사용 된 프로세서 시간에 대한 근사치입니다).

결론 : 여러 가지 최적화를 벤치 마크 할 수 있도록 코드 시간을 정하면 내 대답이 적합합니다. 실제 벽시계 시간을 기준으로 시간 제한을 구현하려는 경우 현지 구현 clock()을 확인하거나 경과 된 벽시계 시간을 제공하기 위해 문서화 된 다른 기능을 사용해야합니다.

업데이트 : C++ 11에는 시간과 기간을 캡처하기위한 다양한 시계와 유형을 제공하는 표준 라이브러리 부분도 있습니다. 표준화되고 널리 사용 가능하지만 안드로이드 NDK가 아직 완전히 지원되는지는 분명하지 않다.

+0

사실이 아닙니다. clock()은 프로세스에 소비 된 시간을 반환하며, 일반적으로 전체 시스템 시간보다 훨씬 작습니다. – darron

+0

@darron : clock()이 시스템 시간을 반환한다고 말하지 않았습니다. 사실, 나는 두 번째 단락의 차이점을 지적했다. 이 질문은 표준 C++ 라이브러리를 사용하는 데 걸리는 시간을 측정하는 방법을 요구했습니다. 내 대답은 어떻게하는지 설명합니다. –

+0

글쎄, 첫 번째와 마지막 단락은 두 번째 존재를 무시하는 것 같습니다. 예제 코드는 'start'이후의 벽시계 시간이 아닌 프로세스 자체에 SPENT 시간을줍니다. 따라서 매우 가벼운 프로세스를 며칠 동안 실행한다면 클록은 5 초에 불과할 것입니다. 느슨하게 타이밍을 잡는 것 외에도 GetTickCount()와 전혀 비슷하지 않습니다. 나는 이것이 낡은 질문/대답이라는 것을 알고 있지만 사람들은 여전히 ​​이러한 것들을 찾고 제공된 정보를 사용하려고 노력한다. – darron