접기
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 ;
}
접기