2015년 6월 1일 월요일

프로그램 시간측정 (소켓포함)

/**
  * int clock_gettime(clockid_t clock_id, struct timespec *tp);
  * Description: clock_settime, clock_gettime, clock_getres - clock and timer functions (REALTIME)
  * need to compile option: -lrt (gcc -o test test.c -lrt)
  **/
#include <time.h>

main()
{
 struct timespec tp;
 int ts;
 ts = clock_gettime(CLOCK_REALTIME, &tp);
 printf(%ld %ld\n”, tp.tv_sec, tp.tv_nsec);
 ts = clock_gettime(CLOCK_REALTIME, &tp);
 printf(%ld %ld\n”, tp.tv_sec, tp.tv_nsec);
 return 0;
}




3.7 소켓 함수 처리시간 측정

3.7.1 유닉스의 시간측정 함수

time() 함수는 1970년 1월 1일 0시부터(이를 Epoch라고 한다) 현재까지 경과된 시간을 초단위로 정수값으로 리턴한다.
ctime()은 time_t 타입의 포인터를 인자로 받아, 날짜와 시간을 나타내는 문자열로 변환해 준다. 아래 프로그램 코드는 현재의 날짜와 시간을 화면에 출력한다.
#include <time.h>
void main(void) { 
    time_t now;
    time(&now);
    printf(“Now : %s”, ctime(&now));
}
위 코드의 실행결과는 다음과 같다.
Now : Wed Dec 8 12:43:39 1999


nano second 단위의 시간을 측정하기 위해서는 clock_gettime()을 사용한다.
#include <time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tp);
typedef  struct  timespec {
    time_t tv_sec; /* second (초) 단위 */
    long tv_nsec; /* nano second 단위 */
} timespec_t;

첫번째 인자 clock_id로 CLOCK_REALTIME을 선택하면, 두번째 인자인 구조체 timespec에 January 1, 1970 00:00시 이후의 시간이 초단위와 nano second 단위로 리턴된다.


3.7.2 소켓 함수 처리시간 측정 프로그램

■ socket_delay.c

소켓 관련 함수들을 실행하는데 소요되는 시간을 clock_gettime()을 이용하여 측정한다.
[실행예]
> socket_delay
For ‘socket’ call : 8045500 nsec
For 'connect’ call : 3622500 nsec
For 'write’ call : 222000 nsec
For 'read’ call : 23732000 nsec
For 'close’ call : 657500 nsec


시간을 측정하기 위하여 timespec 타입 변수의 배열 myclock[2]를 사용하는데 myclock[0]에는 어떤 소켓 함수를 호출하기 직전의 시각을 기록하고 myclock[1]에는 그 소켓 함수를 수행한 직후의 시각을 기록한 다음 이들의 시간차이를 계산해 주는 사용자 정의 함수 calclock()을 호출한다.

struct timespec myclock[2];
long nano_time;
clock_gettime(CLOCK_REALTIME, &myclock[0]);
s = socket(PF_INET, SOCK_STREAM, 0);
clock_gettime(CLOCK_REALTIME, &myclock[1]);
nano_time = calclock( myclock );
printf(“For 'socket’ call :%10ld nsec \n”, nano_time);


프로그램 리스트
/*———————————————- 파일명 : socket_delay.c 기 능 : 소켓 함수 처리 소요 시간을 [nsec] 단위로 측정 컴파일 : cc -o socket_delay socket_delay.c -lsocket -lnsl -lposix4 사용법 : socket_delay IP_addr ———————————————-*/ #include <sys/types.h> #include <sys/socket.h> #include <sys/times.h> #include <netinet/in.h> #include <time.h> #include <stdio.h> #define port_number 7 /* echo 서비스 포트 번호 */ long calclock (struct timespec *myclock); /* 시간 차이를 계산하는 함수 */ void insertnull (char *ps, int len); /* 초기화 함수*/ int main(int argc, char *argv[]) { int s; /* 소켓번호 */ int cd, wd, rd; struct sockaddr_in serv_addr; struct timespec myclock[2]; long timedelay; char wmsg[] =To be or not to be, that is the problem…”; char rbuf[100]; if (argc != 2) { printf(“사용법 : %s server_IP\n”, argv[0]); exit(0); } bzero((char *)&serv_addr, sizeof(serv_addr)); //win32의 경우 serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(port_number); /* —– socket() 처리시간 측정 ————— */ clock_gettime(CLOCK_REALTIME, &myclock[0]); s = socket(PF_INET, SOCK_STREAM, 0); clock_gettime(CLOCK_REALTIME, &myclock[1]); timedelay = calclock( myclock ); printf(“For 'socket’ call :%10ld nsec \n”, timedelay); /* ——– connect() 처리시간 측정 ———- */ clock_gettime(CLOCK_REALTIME, &myclock[0]); cd = connect(s, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); clock_gettime(CLOCK_REALTIME, &myclock[1]); timedelay = calclock(myclock); printf(“For 'connect’ call :%10ld nsec \n”, timedelay); /* ——- write() 처리시간 측정 ————— */ clock_gettime(CLOCK_REALTIME, &myclock[0]); wd = write(s, wmsg, sizeof(wmsg)); clock_gettime(CLOCK_REALTIME, &myclock[1]); timedelay = calclock( myclock ); printf(“For 'write’ call :%10ld nsec \n”, timedelay); /* ——– read() 처리시간 측정 —————- */ clock_gettime(CLOCK_REALTIME, &myclock[0]); rd = read(s, rbuf, sizeof(rbuf)); clock_gettime(CLOCK_REALTIME, &myclock[1]); timedelay = calclock( myclock ); printf(“For 'read’ call :%10ld nsec \n”, timedelay); /* ——— close() 처리시간 측정 ————– */ clock_gettime(CLOCK_REALTIME, &myclock[0]); close(s); clock_gettime(CLOCK_REALTIME, &myclock[1]); timedelay = calclock( myclock ); printf(“For 'close’ call :%10ld nsec \n”, timedelay); } /* 배열 myclock[] 내의 시간차를 리턴하는 함수 */ long calclock( struct timespec *myclock ) { long timedelay, temp, temp_n; if (myclock[1].tv_nsec >= myclock[0].tv_nsec) { temp = myclock[1].tv_sec - myclock[0].tv_sec; temp_n = myclock[1].tv_nsec - myclock[0].tv_nsec; timedelay = 1000000000 * temp + temp_n; } else { temp = myclock[1].tv_sec - myclock[0].tv_sec - 1; temp_n = 1000000000 + myclock[1].tv_nsec - myclock[0].tv_nsec; timedelay = 1000000000 * temp + temp_n; } return timedelay; }

댓글 없음:

댓글 쓰기