2012-10-09 2 views
2

두 개의 정렬 알고리즘이 병합 정렬과 빠른 정렬을 사용하여 N 개의 숫자를 마이크로 초 또는 더 정확하게 정렬하는 데 필요한 코드가 있습니다. 이렇게 계산 된 두 번은 터미널로 출력됩니다. 코드 (코드의 일부) : 그것은 얼마나은 아무 말이 시작 정지로 두 개의 변수를 가지고 각각 함수 호출 위와 아래를 유지하지만,이 나던에 의해 clock_t는 시도 것을 제공함으로써C 프로그램의 특정 함수에 의해 계산 된 시간 계산

printf("THE LIST BEFORE SORTING IS(UNSORTED LIST):\n"); 
printlist(arr,n); 
mergesort(extarr,0,n-1); 
printf("THE LIST AFTER SORTING BY MERGE SORT IS(SORTED LIST):\n"); 
printlist(extarr,n); 
quicksort(arr,0,n-1); 
printf("THE LIST AFTER SORTING BY QUICK SORT IS(SORTED LIST):\n"); 
printlist(arr,n); 

도움말 나 도움을 청하고 항상 그 차이를 0으로 인쇄하십시오. 어떤 유형의 OS에서도 문제가 없다는 것을 명심하십시오. 사전에 도움을 주셔서 감사합니다.

답변

1

Linux에서는 gettimeofday 기능을 호출 할 수 있으며 Windows에서는 timeGetTime이라고 할 수 있습니다. 정렬 함수를 호출하고 정렬 함수를 호출 한 후이 함수를 호출하여 차이를 가져옵니다.

자세한 내용은 매뉴얼 페이지를 확인하십시오. 여전히 확실한 데이터를 얻을 수없는 경우 (작은 데이터 세트로 인해 소요되는 시간이 너무 짧을 수 있음) 'n'회 반복 횟수만큼 시간을 측정하고 단일 실행 시간을 추산하는 것이 좋습니다 정렬 할 데이터 세트의 크기를 늘리십시오.

+0

좋은 예에서 기본 파일이 생성됩니다. http://www.mpp.mpg.de/~huber/util/timevaldiff.c – goji

+0

@jay 두 OS에서 모두 실행되는 프로그램을 만들고 싶습니다. 이 OS를 실행하는 것보다이 OS를 실행하고 싶다면 그 OS를 실행해야합니다. – Mcolorz

+0

시스템 호출을 사용할 때 불행하게도 그럴 수 없습니다. Windows는 완전한 POSIX 표준을 지원하지 않으므로 다른 시스템 호출/인터페이스에 의존해야합니다. –

1

다음을 시도했는지 확실하지 않습니다. 나는 당신의 원본 게시물이 CLOCKS_PER_SEC을 사용해 보았다고 말합니다. CLOCKS_PER_SEC을 사용하고 (stop-start)/CLOCKS_PER_SEC을하면 몇 초를 기다릴 수 있습니다. double은 더 많은 정밀도를 제공합니다.

#include <time.h> 

main() 
{ 
clock_t launch = clock(); 
//do work 
clock_t done = clock(); 
double diff = (done - launch)/CLOCKS_PER_SEC; 
} 
0

리눅스 2.6.26 또는 위의 경우 다음은 getrusage (2) 가장 정확한 방법은 이동하는 것입니다 :

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

// since Linux 2.6.26 
// The macro is not defined in all headers, but supported if your Linux version matches 
#ifndef RUSAGE_THREAD 
#define RUSAGE_THREAD 1 
#endif 
// If you are single-threaded then RUSAGE_SELF is POSIX compliant 
// http://linux.die.net/man/2/getrusage 

struct rusage rusage_start, rusage_stop; 

getrusage(RUSAGE_THREAD, &rusage_start); 

... 

getrusage(RUSAGE_THREAD, &rusage_stop); 

// amount of microseconds spent in user space 
size_t user_time = ((rusage_stop.ru_utime.tv_sec - rusage_start.ru_stime.tv_sec) * 1000000) + rusage_stop.ru_utime.tv_usec - rusage_start.ru_stime.tv_usec; 
// amount of microseconds spent in kernel space 
size_t system_time = ((rusage_stop.ru_stime.tv_sec - rusage_start.ru_stime.tv_sec) * 1000000) + rusage_stop.ru_stime.tv_usec - rusage_start.ru_stime.tv_usec; 
1

이유를 Zero를 얻을 수있는 결과가 가능성이 가난한 해상도로 당신이 사용하는 시간 원본의. 이러한 시간 소스는 일반적으로 약 10 ~ 20ms 씩 증가합니다. 이것은 가난하지만 그것이 그들이 일하는 방식입니다. 이 시간 증가분 내에서 정렬이 완료되면 결과는 zero이됩니다. 시스템 인터럽트 빈도를 늘려서이 결과를 1ms 체제로 증가시킬 수 있습니다. Windows 용 and Linux에서이를 수행하는 표준 방법은 없습니다. 그들은 개인적인 길을 가지고 있습니다. 고주파 카운터로 훨씬 더 높은 해상도를 얻을 수 있습니다. Windows와 Linux는 이러한 카운터에 대한 액세스를 제공하지만 코드는 약간 다르게 보일 수 있습니다.

one piece of codewindows and linux으로 실행하려면 루프로 시간 측정을 수행하는 것이 좋습니다. 루프 내에서 수백 또는 더 많은 시간을 측정하기 위해 코드를 실행하고 루프 외부 시간을 캡처하십시오. 캡처 된 시간을 루프 사이클 수로 나누고 그 결과를 얻습니다.

물론 : 이것은 평가판입니다. 최종 코드에서 그렇게하고 싶지는 않습니다. 및 : 시간 분해능이 1에서 20ms 사이임을 고려하면 측정을 알맞게 해결하려면 총 시간을 잘 선택해야합니다. (힌트 : 루프 카운트를 조정하여 적어도 1 초 정도 가도록하십시오.)

예 :

clock_t start, end; 

printf("THE LIST BEFORE SORTING IS(UNSORTED LIST):\n"); 
printlist(arr,n); 

start = clock(); 
for(int i = 0; i < 100; i++){ 
    mergesort(extarr,0,n-1); 
} 
end = clock(); 
double diff = (end - start)/CLOCKS_PER_SEC; 

// and so on... 

printf("THE LIST AFTER SORTING BY MERGE SORT IS(SORTED LIST):\n"); 
printlist(extarr,n); 
quicksort(arr,0,n-1); 
printf("THE LIST AFTER SORTING BY QUICK SORT IS(SORTED LIST):\n"); 
printlist(arr,n); 
2

방법 : 1

당신은 리눅스 유틸리티 "시간"을 사용할 수있는 프로그램에 의해 수행 된 총 시간을 계산합니다.

Lets your program name is test.cpp. 
    $g++ -o test test.cpp 
    $time ./test 

    Output will be like : 
    real 0m11.418s 
    user 0m0.004s 
    sys 0m0.004s 

방법 : 2

또한 다른 기능으로 시간을 찾기 위해 리눅스 프로파일 방식 "gprof의"를 사용할 수 있습니다.

먼저 "-pg"플래그로 프로그램을 컴파일해야합니다.

$g++ -pg -o test test.cpp 
    $./test 
    $gprof test gmon.out 

PS :의 gmon.out이 gettimeofday를에 의해 반환 된 2 timeval 형 구조체()의 차이를 계산하는 방법을 포함하여, 당신을 위해 gprof은