C 프로그램의 실행 시간


209

여러 프로세서에서 병렬로 실행하려는 C 프로그램이 있습니다. 실행 시간을 기록 할 수 있어야합니다 (1 초에서 몇 분까지 가능). 나는 답을 찾았지만 모두 clock()함수를 사용하도록 제안하는 것처럼 보 였으며 프로그램에 걸린 시계 수를 Clocks_per_second값 으로 나눈 값을 계산해야 합니다.

Clocks_per_second값이 어떻게 계산 되는지 잘 모르겠습니다 .

Java에서는 실행 전후에 현재 시간을 밀리 초 단위로 사용합니다.

C에도 비슷한 것이 있습니까? 나는 보았지만 두 번째 해상도보다 더 나은 것을 얻는 방법을 찾지 못하는 것 같습니다.

또한 프로파일 러가 옵션 일 것임을 알고 있지만 타이머를 직접 구현하려고합니다.

감사


3
어떤 OS / API 프레임 워크를 사용 / 사용 가능합니까? 그냥 평범한 C?
typo.pl

4
그것은 단지 작은 프로그램입니다, 단지 평범한 C
Roger

이 답변에서 휴대용 솔루션 구현에 대한 자세한 내용을 작성했습니다 : stackoverflow.com/questions/361363/…
Alexander Saprykin 2016 년

시간은 완전한 기능을 실행하는 데 걸리는 stackoverflow.com/a/40380118/6180077을
압둘라 Farweez에게

답변:


344

CLOCKS_PER_SEC에 선언 된 상수입니다 <time.h>. C 응용 프로그램 내에서 작업에 사용 된 CPU 시간을 얻으려면 다음을 사용하십시오.

clock_t begin = clock();

/* here, do your time-consuming job */

clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

이것은 시간을 부동 소수점 유형으로 반환합니다. 이것은 1 초보다 정확할 수 있습니다 (예 : 4.52 초 측정). 정밀도는 아키텍처에 따라 다릅니다. 최신 시스템에서는 쉽게 10ms 이하를 얻을 수 있지만 구형 Windows 시스템 (Win98 시대)에서는 60ms에 가깝습니다.

clock()표준 C이고; "모든 곳에서"작동합니다. getrusage()유닉스 계열 시스템과 같은 시스템 별 기능이 있습니다.

Java System.currentTimeMillis()는 동일한 것을 측정하지 않습니다. "벽시계": 프로그램을 실행하는 데 걸리는 시간을 측정하는 데 도움이되지만 사용 된 CPU 시간을 알려주지는 않습니다. 멀티 태스킹 시스템 (즉, 모든 시스템)에서 이러한 시스템은 크게 다를 수 있습니다.


1
그것은 매우 임의의 결과를 제공합니다-동일한 코드 조각에 대해 큰 / 작은 / 음수의 혼합을 얻습니다. GCC 4.7 Linux 3.2 AMD64

3
예 : clock()"시계"라는 내부 스케일로 시간을 반환하며 CLOCKS_PER_SEC초당 클럭 수이므로 CLOCKS_PER_SEC시간을 초 단위로 나눕니다 . 위의 코드에서 값은 double마음대로 조정할 수 있습니다.
Thomas Pornin

18
큰 경고 : clock ()은 실제 경과 시간이 아니라 OS가 프로세스 실행에 소비 한 시간을 반환합니다. 그러나 이것은 코드 블록의 타이밍을 정하는 데는 좋지만 실제 세계에서 시간이 많이 걸리는 것을 측정하지는 않습니다.

2
그는 멀티 스레드 프로그램을 측정하고 싶다고 말했다. 모든 스레드의 실행 시간을 합산하기 때문에 clock ()이 적합하다는 것을 확신하지 못하므로 결과적으로 코드가 순차적으로 실행 된 것처럼 보입니다. 그런 것들에 대해서는 omp_get_wtime ()을 사용하지만 물론 시스템이 다른 프로세스로 바쁘지 않아야합니다.
Youda008

1
나는이 스레드 년 전 관련성에도 불구하고 몇 가지 언급해야한다 : CLOCKS_PER_SECA는 long int값으로 1000000분할하지 않을 경우 마이크로 시간을주는; CPU 클럭 사이클이 아닙니다. 따라서 여기의 클럭이 마이크로 초 (1MHz CPU의 클럭 사이클 일 수 있음)이므로 동적 주파수를 고려할 필요가 없습니다. 그 값을 인쇄하는 짧은 C 프로그램을 만들었고 i7-2640M 랩톱에서 1000000이었습니다. 800MHz ~ 2.8GHz를 허용하는 동적 주파수, Turbo Boost를 사용하여 최대 3.5GHz로 이동합니다.
DDPWNAGE

111

Unix 쉘을 사용하여 실행중인 경우 time 명령을 사용할 수 있습니다.

하기

$ time ./a.out

실행 파일로 a.out을 가정하면이를 실행하는 데 걸리는 시간이 주어집니다.


3
@acgtyrant이지만 입력, 출력 등을 포함한 전체 프로그램 시간이 걸리기 때문에 간단한 프로그램에만 해당됩니다.
phuclv

1
Linux를 사용하고 있고 (마이크로) 벤치 마크를 시작 오버 헤드가 무시할 수있는 프로그램 (예 : 몇 초 동안 핫 루프를 실행하는 정적 실행 파일)으로 줄인 perf stat ./a.out경우 캐시 누락에 대한 HW 성능 카운터를 얻는 데 사용할 수 있습니다 지점의 잘못된 예측 및 IPC.
Peter Cordes

61

일반 바닐라 C에서 :

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

int main()
{
    clock_t tic = clock();

    my_expensive_function_which_can_spawn_threads();

    clock_t toc = clock();

    printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);

    return 0;
}

6
내가 본 최고의 변수 이름. tic = "시계 시간", toc = "시간 초과 시계". 그러나 tic-toc = "tick-tock". 이것이 내가 시간을 붙잡는 방법입니다.
로간 슐리

60

당신은 기능적으로 이것을 원합니다 :

#include <sys/time.h>

struct timeval  tv1, tv2;
gettimeofday(&tv1, NULL);
/* stuff to do! */
gettimeofday(&tv2, NULL);

printf ("Total time = %f seconds\n",
         (double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
         (double) (tv2.tv_sec - tv1.tv_sec));

이것은 초가 아니라 마이크로 초 단위로 측정됩니다.


2
MinGW 컴파일러는 GCC 기반입니다. 따라서 작동합니다. 그러나 Visual C 컴파일러를 사용하면 오류가 발생합니다.
user2550754

11
예, gettimeofday 호출을 지원하는 ac 라이브러리가있는 Windows에서 작동합니다. 실제로 컴파일러가 무엇이든 상관없이 괜찮은 libc 라이브러리와 링크하면됩니다. mingw의 경우 기본 창이 아닙니다.
Wes Hardaker

1
이것은 cygwin gcc 및 Linux Ubuntu가 설치된 Windows XP에서 작동합니다. 이것은 내가 원하는 것입니다.
사랑과 평화-Joe 코드 웰

gettimeofday더 이상 사용되지 않으며 새 코드에는 권장되지 않습니다. POSIX 매뉴얼 페이지는 clock_gettime 을 권장 합니다. 이는 CLOCK_MONOTONIC시스템 시계의 변경에 영향을받지 않는 것을 요청할 수 있으므로 간격 시간보다 낫습니다. ( JohnSll의 답변 참조 ). 예를 들어, 최신 Linux 시스템에서 gettimeofday는 기본적으로 나노초를 마이크로 초로 변환하는 clock_gettime의 래퍼입니다.
Peter Cordes

12

간단한 프로그램의 대부분은 계산 시간이 밀리 초입니다. 그래서, 당신은 이것이 유용하다고 생각합니다.

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

int main(){
    clock_t start = clock();
    // Execuatable code
    clock_t stop = clock();
    double elapsed = (double)(stop - start) * 1000.0 / CLOCKS_PER_SEC;
    printf("Time elapsed in ms: %f", elapsed);
}

전체 프로그램의 런타임을 계산하고 Unix 시스템에있는 경우 다음 과 같이 time 명령을 사용하여 프로그램을 실행하십시오.time ./a.out


Windows에서 적어도 그 요소는 100 이상 1000이 아니고 정확하지 않습니다
boctulus

6
이 답변은 Alexandre C 의 2 년 전 답변 에없는 내용은 추가하지 않습니다 .
Jonathan Leffler

3
@ boctulus : 1s는 항상 1000ms이며 Windows에서도 마찬가지입니다.
alk

9

답변의 많은 제안 된 clock()다음과 CLOCKS_PER_SEC에서 time.h. 이것은 내 /bits/time.h파일이 말하는 것이므로 아마도 나쁜 생각입니다 .

/* ISO/IEC 9899:1990 7.12.1: <time.h>
The macro `CLOCKS_PER_SEC' is the number per second of the value
returned by the `clock' function. */
/* CAE XSH, Issue 4, Version 2: <time.h>
The value of CLOCKS_PER_SEC is required to be 1 million on all
XSI-conformant systems. */
#  define CLOCKS_PER_SEC  1000000l

#  if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
presents the real value for clock ticks per second for the system.  */
#   include <bits/types.h>
extern long int __sysconf (int);
#   define CLK_TCK ((__clock_t) __sysconf (2))  /* 2 is _SC_CLK_TCK */
#  endif

따라서 CLOCKS_PER_SEC컴파일하는 데 사용하는 옵션에 따라 1000000으로 정의 될 수 있으므로 좋은 솔루션처럼 보이지 않습니다.


1
정보에 감사하지만 아직 더 나은 대안이 있습니까?
ozanmuyes

4
이것은 실질적인 문제는 아니다 : 예 Posix 시스템은 항상을 CLOCK_PER_SEC==1000000갖지만, 동시에 그것들은 clock () 구현을 위해 1-µs 정밀도를 사용한다; 그건 그렇고, 공유 문제를 줄이는 좋은 속성이 있습니다. 당신은 잠재적으로 매우 빠른 이벤트를 측정 할 경우, 1 밀리 초 이하라고, 당신해야 필요하여 Posix에서 1μs의보다 거친이지만, 또한 종종 시계 () 함수의 정확도 (또는 해상도)에 대한 최초의 걱정 많이 거칠어; 일반적인 해결책은 테스트를 여러 번 실행하는 것입니다. 그러나 요청 된 질문은 그것을 요구하지 않는 것 같습니다.
AntoineL

좋은 해결책이 아닌 이유는 무엇입니까? 값 clock()을 나누면 CLOCK_PER_SECCPU에서 몇 초 만에 시간을 얻을 수 있습니다. 실제 클럭 속도를 측정하는 책임은 사용자의 책임이 clock()아니라 기능의 책임입니다 .
Zaffy

9

매크로로 Thomas Pornin의 답변 :

#define TICK(X) clock_t X = clock()
#define TOCK(X) printf("time %s: %g sec.\n", (#X), (double)(clock() - (X)) / CLOCKS_PER_SEC)

다음과 같이 사용하십시오.

TICK(TIME_A);
functionA();
TOCK(TIME_A);

TICK(TIME_B);
functionB();
TOCK(TIME_B);

산출:

time TIME_A: 0.001652 sec.
time TIME_B: 0.004028 sec.

4

프로그램을 실행하는 데 걸리는 시간 을 측정 하는 것은 기계가 특정 순간에 가하는 부하에 따라 달라진다는 점을 고려해야합니다 .

C로 현재 시간을 얻는 방법은 여러 가지 방법으로 달성 할 수 있다는 것을 알고 있으면 더 쉬운 방법입니다

#include <time.h>

#define CPU_TIME (getrusage(RUSAGE_SELF,&ruse), ruse.ru_utime.tv_sec + \
  ruse.ru_stime.tv_sec + 1e-6 * \
  (ruse.ru_utime.tv_usec + ruse.ru_stime.tv_usec))

int main(void) {
    time_t start, end;
    double first, second;

    // Save user and CPU start time
    time(&start);
    first = CPU_TIME;

    // Perform operations
    ...

    // Save end time
    time(&end);
    second = CPU_TIME;

    printf("cpu  : %.2f secs\n", second - first); 
    printf("user : %d secs\n", (int)(end - start));
}

도움이 되길 바랍니다.

문안 인사!


4

(sysadmin이 시스템 시간을 변경하거나 시간대가 겨울과 서머 타임이 다른 경우 여기에 모든 답변이 부족합니다. 따라서 ...)

Linux 사용시 : clock_gettime(CLOCK_MONOTONIC_RAW, &time_variable); 시스템 관리자가 시간을 변경하거나 겨울철이 여름철과 다른 국가에 거주하는 경우 영향을받지 않습니다.

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

#include <unistd.h> /* for sleep() */

int main() {
    struct timespec begin, end;
    clock_gettime(CLOCK_MONOTONIC_RAW, &begin);

    sleep(1);      // waste some time

    clock_gettime(CLOCK_MONOTONIC_RAW, &end);

    printf ("Total time = %f seconds\n",
            (end.tv_nsec - begin.tv_nsec) / 1000000000.0 +
            (end.tv_sec  - begin.tv_sec));

}

man clock_gettime 상태 :

CLOCK_MONOTONIC
              Clock  that  cannot  be set and represents monotonic time since some unspecified starting point.  This clock is not affected by discontinuous jumps in the system time
              (e.g., if the system administrator manually changes the clock), but is affected by the incremental adjustments performed by adjtime(3) and NTP.

초 수를 계산하는 데 사용한 계산을 설명 할 수 있습니까? 무슨 일이 일어나고 있는지 분명하지 않습니다.
Colin Keenan

1
(end.tv_nsec - begin.tv_nsec) / 1000000000.0결과가 0항상 그렇지 않습니까?
alk

@alk 없음, a로 나눈 double문자 트리거 값 int거나 longdouble변환 전의 분할. 물론 정수를 고수하고 tv_sec부분을 인쇄 한 다음 분수 부분을 0과 같이 인쇄 할 수는 %ld.%09ld있지만 double로 변환하는 것은 쉽지 않으며 53 비트의 정밀도는 일반적으로 벤치 마크 시간에 충분합니다.
Peter Cordes

1
(나노초 부분을 빼려면 초 부분으로 이동해야 할 수도 있으므로 double을 사용하고 음수로 설정하면 문제를 피할 수 있습니다. 순수한 정수 형식 문자열을 사용하려면 glibc 매뉴얼에서 제안한 timespec_subtract것과 비슷 해야합니다. timeval_subtract: gnu.org/software/libc/manual/html_node/Elapsed-Time.html )
Peter Cordes

3

ANSI C는 두 번째 정밀 시간 함수 만 지정합니다. 그러나 POSIX 환경에서 실행중인 경우 , UNIX Epoch 이후에 경과 된 시간의 마이크로 초 해상도를 제공 하는 gettimeofday () 함수를 사용할 수 있습니다 .

부수적으로, clock ()은 많은 (전부는 아님) 시스템에서 잘못 구현되어 정확하지는 않기 때문에 clock ()을 사용하지 않는 것이 좋습니다. 단, 프로그램이 CPU에 소비 한 시간과 귀하의 질문에 따라 귀하가 측정하고 싶은 것으로 가정하는 프로그램의 총 수명이 아닙니다.


ISO C 표준 ( ANSI C가 의미 하는 것으로 가정 )은 시간 함수 의 정밀도를 의도적으로 지정하지 않습니다 . 그런 다음 POSIX 구현 또는 Windows에서 벽시계 (토마스의 답변 참조) 기능의 정밀도는 몇 초 안에 있습니다. 그러나 clock ()의 ​​정밀도는 일반적으로 더
높으며

2

모든 솔루션이 시스템에서 작동하지 않습니다.

사용할 수 있습니다

#include <time.h>

double difftime(time_t time1, time_t time0);

2
이것은 두 time_t값 의 차이를 두 배로 제공합니다. time_t값은 1 초까지만 정확하기 때문에 단기 실행 프로그램에 걸리는 시간을 인쇄하는 데는 제한적이지만 장기간 실행되는 프로그램에는 유용 ​​할 수 있습니다.
Jonathan Leffler

어떤 이유로 든 한 쌍의 clock_ts를 전달 difftime하면 100 분의 1 초의 정밀도로 작동 하는 것 같습니다. 이것은 리눅스 x86에 있습니다. 또한의 공제받을 수 없습니다 stopstart작업을합니다.
ragerdl

@ragerdl : difftime() clock() / CLOCKS_PER_SEC초를 예상 하므로에 전달해야합니다 .
alk

2
    #include<time.h>
    #include<stdio.h>
    int main(){
clock_t begin=clock();

    int i;
for(i=0;i<100000;i++){
printf("%d",i);

}
clock_t end=clock();
printf("Time taken:%lf",(double)(end-begin)/CLOCKS_PER_SEC);
}

이 프로그램은 매력처럼 작동합니다.


2

모든 사람들이 여기에서 권장하는 일반적인 clock ()은 어떤 이유로 든 화면에서 그리기 또는 파일 읽기와 같은 부작용이없는 정적 코드조차도 실행에서 크게 벗어납니다. CPU가 전력 소비 모드, 다른 우선 순위를 제공하는 OS 등을 변경하기 때문일 수 있습니다.

따라서 clock ()을 사용하여 매번 동일한 결과를 안정적으로 얻을 수있는 유일한 방법은 측정 코드를 여러 번 반복하여 (몇 분 동안) 컴파일러가 최적화하지 못하도록 예방 조치를 취하는 것입니다. 최신 컴파일러는 코드를 미리 계산할 수 있습니다 루프에서 부작용을 일으키지 않고 루프 밖으로 이동합니다. 예를 들어 각 반복에 임의의 입력을 사용하는 것과 같습니다.

충분한 샘플이 배열로 수집 된 후 배열을 정렬하고 중간 값이라는 중간 요소를 가져옵니다. 안티 바이러스는 모든 CPU를 차지하는 안티 바이러스 나 일부 업데이트를 수행하는 OS와 같이 극단적 인 편차를 없애기 때문에 평균보다 낫습니다.

다음은 중앙값 근처의 값을 평균화하여 C / C ++ 코드의 실행 성능을 측정하는 간단한 유틸리티입니다. https://github.com/saniv/gauge

나는 여전히 코드를 측정하는 더 강력하고 빠른 방법을 찾고 있습니다. OS없이 베어 메탈에서 제어 된 조건에서 코드를 실행하려고 시도 할 수는 있지만 실제로는 OS가 관여하기 때문에 비현실적인 결과를 얻을 수 있습니다.

x86에는 실제 실행되는 명령 수를 포함하여 이러한 하드웨어 성능 카운터가 있지만 OS의 도움 없이는 접근하기가 까다 롭고 해석하기가 어렵고 자체 문제가 있습니다 ( http://archive.gamedev.net/archive/reference/articles /article213.html ). 여전히 병목 현상의 특성 (데이터 액세스 또는 해당 데이터의 실제 계산)을 조사하는 데 도움이 될 수 있습니다.


그렇습니다. 최신 x86 CPU는 최대 터보보다 훨씬 느리게 유휴 상태입니다. "거버너"설정에 따라 최대 클럭 속도까지 상승하는 데 밀리 초 (하드웨어 P 상태 관리, 특히 energy_performance_preference가으로 설정된 스카이 레이크 performance) 또는 수십 밀리 초가 걸릴 수 있습니다 . en.wikipedia.org/wiki/Dynamic_frequency_scaling . 그리고 그렇습니다. 중간 성능은 일반적으로 좋은 선택입니다. 하이 엔드에는 일반적으로 간섭으로 인한 스파이크가 있습니다.
Peter Cordes

작업 최적화를 피하는 가장 좋은 방법은 명령 행 입력이며 결과를 반환하는 것입니다. 또는 mainarg를 사용하고 결과를 반환 하는 별도의 파일에 함수를 작성하고 링크 시간 최적화를 사용하지 마십시오. 그런 다음 컴파일러는이를 호출자에게 인라인 할 수 없습니다. 함수에 이미 어떤 종류의 루프가 포함 된 경우에만 작동합니다. 그렇지 않으면 호출 / ret 오버 헤드가 너무 높습니다.
Peter Cordes

컴파일러는 부작용없이 정적 코드로 처리하는 경우 루프에서 단일 명령 행 입력을 계속 최적화 할 수 있습니다. 따라서 각 반복마다 임의의 입력을 생성하는 것이 가장 좋습니다. rand ()는 일부 하드웨어 엔트로피 생성기 (구형 시스템에서는 마우스 움직임)를 샘플링하여 시스템 호출을 일으킬 수 있기 때문에 rand ()는 첫 번째 clock () 전에 측정 된 코드 외부에서 호출해야합니다. 출력의 모든 비트를 printf하는 것을 잊지 마십시오. 그렇지 않으면 컴파일러가 전체 또는 일부 출력을 필요로하지 않을 수도 있습니다. CRC32라고하면됩니다.
SmugLispWeenie

테스트중인 코드를 별도의 파일로 입력하고 링크 시간 최적화를 사용하지 않으면 컴파일러가 CSE를 수행하여 호출간에 최적화 할 수있는 방법이 없습니다. 발신자는 수신자에게 눈에 띄는 부작용이없는 것으로 가정 할 수 없습니다. 이를 통해 반복 루프 내에 비교적 짧은 것을 배치 하여 호출 / 재시 오버 헤드로 시간을 충분히 확보 할 수 있습니다. 인라인으로 허용하면 생성 된 asm을 확인하여 원하는대로 루프 밖으로 계산을 올리지 않았는지 확인해야합니다.
Peter Cordes

컴파일러 고유의 방법은 (예를 들어) GNU C 인라인 asm을 사용하여 컴파일러가 결과를 레지스터에 구체화하거나 추가 명령어를 실제로 도입하지 않고 변수 값에 대해 알고있는 것을 잊게하는 것입니다. MSVC의 "Escape"및 "Clobber" 는 프로파일 링 및 마이크로 벤치마킹 (클랜 개발자 Chandler Carruth의 CppCon 2015 이야기)에 대한 비디오로 연결됩니다. MSVC에 해당하는 것은 없지만 질문 자체는 GNU C 기능과 사용법을 보여줍니다.
Peter Cordes

0

일부는 다른 종류의 입력이 유용하다는 것을 알 수 있습니다. NVidia CUDA를 사용한 GPGPU 프로그래밍에 대한 대학 과정의 일부로 시간을 측정하는이 방법을 받았습니다 ( 코스 설명 ). 이전 게시물에서 보았던 방법을 결합한 것입니다. 요구 사항에 신뢰성이 있기 때문에 간단히 게시합니다.

unsigned long int elapsed;
struct timeval t_start, t_end, t_diff;
gettimeofday(&t_start, NULL);

// perform computations ...

gettimeofday(&t_end, NULL);
timeval_subtract(&t_diff, &t_end, &t_start);
elapsed = (t_diff.tv_sec*1e6 + t_diff.tv_usec);
printf("GPU version runs in: %lu microsecs\n", elapsed);

1.0 / 1000.0를 들어 필요에 맞는 측정 단위를 얻기 위해 곱할 수 있다고 가정 합니다.


1
gettimeofday는 사용되지 않으며 권장되지 않습니다. POSIX 매뉴얼 페이지가 clock_gettime대신 권장 합니다.이를 통해 CLOCK_MONOTONIC시스템 클럭의 변경에 영향을받지 않도록 요청할 수 있으므로 간격 타이머로 사용하는 것이 좋습니다. 예를 들어 최신 Linux 시스템에서는 gettimeofday기본적으로 clock_gettime나노초를 마이크로 초로 변환 하는 래퍼입니다 . (JohnSll의 답변 참조).
Peter Cordes

이 방법은 @Wes Hardaker에 의해 추가되었으며 주요 차이점은 timeval_subtract.
ワ イ き ん ぐ

자, 대답의 유일한 유용한 부분은 정의하지 않은 함수의 이름이며 표준 라이브러리에는 없습니다. (glibc 매뉴얼에서만 : gnu.org/software/libc/manual/html_node/Elapsed-Time.html ).
Peter Cordes

-2

거품 정렬 및 선택 정렬의 실행 시간 비교 거품 정렬 및 선택 정렬의 실행 시간을 비교하는 프로그램이 있습니다. 코드 블록의 실행 시간을 찾으려면 블록 전후의 시간을 계산하십시오.

 clock_t start=clock();
 
 clock_t end=clock();
 CLOCKS_PER_SEC is constant in time.h library

예제 코드 :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
   int a[10000],i,j,min,temp;
   for(i=0;i<10000;i++)
   {
      a[i]=rand()%10000;
   }
   //The bubble Sort
   clock_t start,end;
   start=clock();
   for(i=0;i<10000;i++)
   {
     for(j=i+1;j<10000;j++)
     {
       if(a[i]>a[j])
       {
         int temp=a[i];
         a[i]=a[j];
         a[j]=temp;
       }
     }
   }
   end=clock();
   double extime=(double) (end-start)/CLOCKS_PER_SEC;
   printf("\n\tExecution time for the bubble sort is %f seconds\n ",extime);

   for(i=0;i<10000;i++)
   {
     a[i]=rand()%10000;
   }
   clock_t start1,end1;
   start1=clock();
   // The Selection Sort
   for(i=0;i<10000;i++)
   {
     min=i;
     for(j=i+1;j<10000;j++)
     {
       if(a[min]>a[j])
       {
         min=j;
       }
     }
     temp=a[min];
     a[min]=a[i];
     a[i]=temp;
   }
   end1=clock();
   double extime1=(double) (end1-start1)/CLOCKS_PER_SEC;
   printf("\n");
   printf("\tExecution time for the selection sort is %f seconds\n\n", extime1);
   if(extime1<extime)
     printf("\tSelection sort is faster than Bubble sort by %f seconds\n\n", extime - extime1);
   else if(extime1>extime)
     printf("\tBubble sort is faster than Selection sort by %f seconds\n\n", extime1 - extime);
   else
     printf("\tBoth algorithms have the same execution time\n\n");
}

4
이것은 실제 코드로 '실행 코드'블록 (또는 두 개)을 채우는 것을 제외하고는 adimoh답변 과 비교하여 새로운 것을 실제로 추가하지 않습니다 . 그리고 그 대답은 Alexandre C 의 2 년 전 답변 에 없었던 것을 추가하지 않습니다 .
Jonathan Leffler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.