http://www.codedream.net/blog/

 

출처 : Internet 에서 구한 문서입니다.
================================================================================================

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));
   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;
}

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,