2014-12-08 3 views
1

다음 방법을 사용하여 STL 컨테이너 vector, deque, list, multiset 및 multimap에 대한 일부 작업 시간을 측정했습니다. 내가 STL 컨테이너에 벡터에서 요소를 추가 한 다음 벡터로 이동하고, 문자열의 전체 목록 상자를 :타이밍 STL 컨테이너 - 와이드 변형?

PrecisionTimer::PrecisionTimer() 
{ 
    LARGE_INTEGER cps; 
    LARGE_INTEGER init_cnt; 

    QueryPerformanceCounter(&init_cnt); 
    QueryPerformanceFrequency(&cps); 

    start_count = init_cnt.QuadPart; 
    microseconds_per_count = 1000000.0/cps.QuadPart; 
} 

void PrecisionTimer::ReStart() 
{ 
    LARGE_INTEGER init_cnt; 
    QueryPerformanceCounter(&init_cnt); 
    start_count = init_cnt.QuadPart; 
} 


// in microseconds 
unsigned int PrecisionTimer::ElaspedTime() const 
{ 
    LARGE_INTEGER cnt; 
    QueryPerformanceCounter(&cnt); 
    return (unsigned int)((cnt.QuadPart - start_count) 
         * microseconds_per_count + 0.5); 
} 

과정은 단순히 이것이다. 그런 다음 컨테이너에서 모든 요소를 ​​제거하고 마이크로 초가 걸리는 시간을받습니다.

내 질문에 대한 차이점 : 때로는 내 재판이 첫 번째 시도와 다른 60,000+ 마이크로 초입니다. 왜? 타이머 구현과 관련이 있습니까? 나는 timeslicing과 high-speech cache의 효과 방향을 지적했다. 아무도 그것에 정교 할 수 있습니까? CPU 사용이 영향을 줍니까?

더 나은 타이머 구현을 요구하지 않습니다. 나는 그것이 왜 다른지 묻습니다.

+0

금요일 오후 4시 55 분에서 5 시까 지 갈 시계 - 외계인! –

+0

최적화로 컴파일 중입니까? 타이밍에 맞지 않는 코드가 부작용이 없다면 최적화되지 않았습니까? 실행중인 테스트를 보지 않고도 추측하기가 어렵습니다. –

+0

최적화되지 않은 또는 "디버그"빌드를 실행중인 경우 타이밍 테스트가 의미가 없습니다. – PaulMcKenzie

답변

1

간단히 말해서, 시스템에 적은 수의 CPU 코어가 있지만 동시에 많은 프로세스가 동시에 실행되고 있습니다. 이를 달성하기 위해 운영 체제는 다음 프로세스에 대해 동일한 작업을 수행하기 전에 프로세스에 시간을 할당합니다. 어떤 프로그램이 어떤 일을 하느냐에 따라, 시간 조각의 일부 또는 전부를 필요로하지 않을 수도 있습니다. 실행되는 프로세스의 수와 같이 다양하기 때문에 코드가 호출 될 때마다 가변 기간을 가질 수 있습니다. 코드의 일정한 실행 시간과 함께 사용하면 코드에서 다른 초 수가됩니다. 당신이 프로그램을 시작했을 때부터 완료 될 때까지의 벽시계.

QueryHighPerformance 함수는 월 클럭에서 경과 된 시간을 반환하기 때문에 스케줄링의 이러한 차이를 고려하지 않으므로 동일한 데이터로 동일한 코드를 실행하는 데 필요한 시간으로 다양한 양을보고합니다. Win7 작업 관리자 (보기 -> 열 선택 -> CPU 시간)에서 사용 가능한 "CPU 시간"열과 비슷하게 이상적인 타이머는 프로세스에서 소비되는 시간을 반환합니다.