Linux 의 시간 계산

7383 단어 LinuxShell
본 고 는 리 눅 스 시스템 에서 시간 계산 과 관련 된 문제 와 해결 방법 을 묘사 하 였 다.학습 과 연 구 를 하 는 과정 에서 우 리 는 통계 절차 나 절차 단계 의 시간 을 소모 하여 그들의 성능 의 좋 고 나 쁨 을 평가 해 야 하기 때문이다.그래서 이런 문제 들 은 우리 에 게 자주 발생 한다.여러 가지 시간 계산 방법 을 습득 하 는 것 은 개발 자 나 과학 연구자 에 게 있어 서 반드시 습득 해 야 할 기능 이다.본 고 는 리 눅 스 시간 계산 에서 자주 발생 하 는 기술적 문 제 를 해결 하고 타인 의 업무 에 도움 이 될 것 이 라 고 믿는다.
실제로 본문 토론 의 임 무 를 완성 할 수 있 는 다른 방법 도 있 을 것 이다.나 는 단지 내 가 사용 하 는 방법 을 토론 했다. 이것 은 이것 을 제외 한 다른 방법 이 매우 나쁘다 는 것 을 의미 하 는 것 이 아니 라, 단지 나 에 게 이런 방법 들 이 상대 적 으로 간단 하고 효과 가 있 을 뿐이다.
Linux 의 시간
리 눅 스 시스템 에서 시간 은 매우 중요 한 역할 을 하 는데 거의 없 는 곳 이 없다.켜 면 다음 과 같은 정보 가 표 시 됩 니 다.
Last login: Tue Sep 23 22:12:50 from 192.168.6.100

전원 이 꺼 졌 을 때, 우 리 는 shutdown 명령 을 사용 하여 언제 또는 얼마나 걸 리 면 기계 가 정시 에 꺼 질 지 지정 할 수 있 습 니 다.우 리 는 리 눅 스 시간 서버 를 인터넷 의 1 급 또는 2 급 시간 서버 와 동기 화 할 수도 있다. 한 마디 로 리 눅 스 시스템 에서 우 리 는 시간 을 알 아야 한다.
실제로 Liux 시스템 은 자신의 타이머 시 계 를 가지 고 있다.날짜 와/sbin/clock (또는 sbin/hwclock) 명령 을 각각 실행 하면 얻 는 시간 이 다 릅 니 다.
[grandiose@Bygone grandiose]$ date
Sun Sep 28 21:11:02 EDT 2003
[grandiose@Bygone grandiose]$ /sbin/clock
Sun 28 Sep 2003 09:07:07 PM EDT  -0.466994 seconds

루트 로 시스템 시간 을 바 꾼 후에 clock - w 로 시스템 시간 을 CMOS 에 기록 하 는 것 을 기억 하 세 요.
C 언어 로 시간 잽 니 다.
사용자 공간 에서 C 언어 함수 gettimeofday 를 사용 하여 시간 을 얻 을 수 있 습 니 다. 호출 형식 은:
#include  
int gettimeofday(struct timeval *tv, struct timezone *tz); 
int settimeofday(const struct timeval *tv , const struct timezone *tz);
	  timeval    :
strut timeval {
long tv_sec; /*    */
long tv_usec; /*     */
};

이런 방식 으로 시간 을 재 면 정밀도 가 초, 즉 10 - 6 초 에 달 하 는 것 을 알 수 있다.시간 을 재 려 면 gettimeofday 를 앞 뒤로 두 번 호출 한 다음 에 중간 차 이 를 계산 해 야 합 니 다.
gettimeofday( &start, NULL );
foo(); 
gettimeofday( &end, NULL );
timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; 
timeuse /= 1000000;

셸 타임
Linux 의 Shell 에서 도 Shell 에 내 장 된 time 명령 과 GNU 버 전의 time 명령 을 사용 하여 프로그램 이 실행 되 는 시간 을 테스트 합 니 다.
내 장 된 time 에서 제공 하 는 매개 변수 옵션 은 비교적 적 고 GNU 의 time 은 지정 한 출력 파일 등 다양한 매개 변수 옵션 을 제공 합 니 다.
[grandiose@Bygone grandiose]$ /usr/bin/time --output=foo.txt foo

위의 문장 은 foo. txt 파일 에 시간 정보 만 출력 되 었 습 니 다. foo 실행 결 과 를 포함 하려 면 다음 문장 을 누 르 고 사용 해 야 합 니 다.
[grandiose@Bygone grandiose]$ /usr/bin/time --output=foo.txt --append foo >foo.txt

출력 시간 을 제어 하려 면 - f 스위치 를 사용 하여 포맷 할 수 있 습 니 다.
[grandiose@Bygone grandiose]$ /usr/bin/time 
   --output=foo.txt -f "\\t%E real,\\t%U user,\\t%S sys" foo

Shell 에 내 장 된 time 명령 이 필요 하 다 면 다음 문장 으로 결 과 를 파일 로 출력 할 수 있 습 니 다.
[grandiose@Bygone grandiose]$ (time foo) 2>foo.txt

이렇게 쓰 는 것 은 내 장 된 명령 time 의 출력 이 표준 오류 에 이 르 렀 기 때 문 입 니 다. 파일 설명자 2 는 표준 오류 stderr 를 표시 합 니 다.foo 실행 결 과 를 포함 하려 면 이렇게 해 야 합 니 다.
[grandiose@Bygone grandiose]$ (time foo) >foo.txt 2>&1

그 중에서 2 > & 1 의 의 미 는 2 와 1 이 같 고 foo. txt 에 함께 보 내 는 것 이다.
nohup 명령 은 프로 세 스 가 시스템 을 종료 한 후에 도 실 행 될 수 있 도록 보장 합 니 다. 이것 은 일반적인 용법 입 니 다.우리 도 이렇게 nohup 을 사용 할 수 있다.
[grandiose@Bygone grandiose]$ nohup time foo

결 과 는 모두 nohup. out 으로 출력 되 며 프로그램 이 실행 되 는 시간 정보 도 포함 되 어 있 습 니 다.다음 문 구 를 사용 하여 시간 정 보 를 파일 foo. txt 에 출력 할 수 있 습 니 다.
[grandiose@Bygone grandiose]$ tail -2 nohup.out > foo.txt

POSIX 와 일치 하도록 출력 시간 형식 은 (nohup. out 의 내용 제외) 입 니 다.
real    0m0.007s
user    0m0.002s
sys     0m0.004s

우 리 는 awk, sed, grep, tr 등 Liux 아래 의 필터 명령 을 사용 하여 우리 가 원 하 는 내용 을 걸 러 낼 수 있 습 니 다. 예 를 들 어 real 세그먼트 에 대응 하 는 시간 을 얻 으 려 면:
[grandiose@Bygone grandiose]$ grep real foo.txt | cut -f2,  
[grandiose@Bygone grandiose]$ sed -n '2p' foo.txt | cut -f2

Shell 에서 출력 시간 정 도 는 밀리초 급 이 며, 초 단위 의 시간 이 필요 하 다 면 프로그램 에서 처리 해 야 합 니 다.
커 널 공간 에서 의 시간 계산
자신의 장치 드라이버 를 맞 추 려 면 커 널 의 시간 계산 기능 을 사용 할 수 있 습 니 다.리 눅 스 커 널 공간 에서 의 시간 은 사용자 공간의 시간 과 다르다.커 널 공간 에 전역 변수 인 Jiffies 가 현재 시간 을 유지 하고 있 습 니 다.시스템 시계 와 관련 된 호출 은 다음 과 같 습 니 다.
#include  
#include  
void add_timer(struct timer_list * timer); 
int del_timer(struct timer_list * timer); 
inline void init_timer(struct timer_list * timer);

구조 struct timerlist 의 정의:
struct timer_list { 
	struct timer_list *next; 
	struct timer_list *prev; 
	unsigned long expires; 
	unsigned long data; 
	void (*function)(unsigned long d); 
};

그 중 만 료 시간 expires 는 function 을 실행 할 시간 입 니 다.보통 add 호출 중timer 시 jiffies = jiffies + num 은 num 개 시스템 의 최소 시간 간격 후에 function 를 실행 하 는 것 을 나타 낸다.시스템 의 최소 시간 간격 은 사용 하 는 하드웨어 플랫폼 과 관련 이 있 으 며, 핵심 에 상수 HZ 가 1 초 간 최소 시간 간격 을 나타 내 는 수 를 정의 하면 num * HZ 는 num 초 를 나타 낸다.시스템 은 예 정 된 시간 까지 function 을 호출 하고 이 서브루틴 을 정시 대기 열 에서 삭제 합 니 다. 따라서 일정 시간 간격 으로 실행 하려 면 function 에서 add 를 다시 호출 해 야 합 니 다.timer.function 의 인자 d 는 timer 안의 data 항목 입 니 다.
Jiffies 의 시간 측정 정 도 는 1% 초 입 니 다. 커 널 에서 더 정확 한 시간 이 필요 하 다 면 timecalls. h 의 함 수 는 높 은 정밀도 의 시간 계산 에 사용 할 수 있 습 니 다.
보충 하 다
때때로 우 리 는 측 정 된 목표 의 운행 시간 을 비교적 정확하게 얻어 야 한다. 이때 보통 여러 번 운행 해서 평균 값 을 취해 오 차 를 없 애 야 한다.
gettimeofday( &start, NULL );
for ( int i = 0; i< 10; i++ ) foo(); 
gettimeofday( &end, NULL );
timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; 
timeuse /= 10000000;

위의 통계 도 실제 적 으로 새로운 오 차 를 도입 했다. 순환 명령 의 실행 시간 이 foo () 에 비해 무시 할 수 있다 면 이런 시간 계산 이 받 아들 일 수 있다.그렇지 않 으 면 우 리 는 순환 명령 의 실행 시간 을 제거 해야만 정확 한 통계 시간 을 얻 을 수 있다.
Linux Shell 에서 통계 횟수 가 적 으 면 다음 과 같이 할 수 있 습 니 다.
for i in 1 2 3 4 5 6 7 8 9 10
do
	(time foo) 2>foo.tmp
	grep real foo.tmp | cut -f2 >> foo.txt
done

시간 계산 횟수 가 많 으 면:
i=1
while [ $i -le 100 ]
do
	(time foo) 2>foo.tmp
	grep real foo.tmp | cut -f2 >> foo.txt
	i=`expr $i + 1`
done

foo. txt 의 내용 을 수 동 으로 평균 값 을 계산 하면 시간 이 걸 릴 수 있 습 니 다. 셸 스 크 립 트 를 쓰 거나 C 언어 로 파일 을 읽 고 평균 값 을 계산 할 수 있 습 니 다.
/*       */
cut -d'm' -f1 foo.txt > foo.tmp
sum=0
while read line
do
	sum=$(echo "$sum+$line" | bc -l)
done < foo.tmp
echo $sum
/*       */
cut -d'm' -f2 foo.txt | tr -d 's'> foo.tmp
sum=0
while read line
do
	sum=$(echo "$sum+$line" | bc -l)
done < foo.tmp
echo $sum

분부 와 초 부 를 합 친 후 평균 치 를 수 동 으로 계산 하 는 것 이 훨씬 쉽다.위 에서 expr 를 사용 하여 계산 하지 않 은 이 유 는 expr 가 정형 값 만 지원 하기 때 문 입 니 다.Linux 셸 에서 부동 소수점 을 계산 하려 면 bc 나 gexpr 를 사용 해 야 합 니 다.
종결 어
실제로 우 리 는 Perl, Python 등 다양한 언어 를 사용 하여 Linux 시스템 에서 시간 을 계산 할 수 있다.어떤 도구 나 언어 를 선택 하여 시간 을 잽 니까? 이것 은 테스트 되 는 프로그램 이나 프로그램의 종류 와 그들의 작성 언어 와 관련 이 있 습 니 다.정밀도, 운행 시간, 운행 횟수 등 요 구 를 종합 적 으로 고려 해 야 프로그램의 운행 시간 을 합 리 적 이 고 신뢰성 있 게 얻 을 수 있다.
참고 자료
읽 어 주세요. RunTime: High - performance programming techniques on Linux and Windows 2000 에는 Linux 와 Windows 플랫폼 에서 시간 계산 성능 비용 에 대한 토론 이 있 습 니 다
사이트 참조 중국어 Linux 지식 라 이브 러 리..
gexpr 에 관 한 정 보 는 사 이 트 를 참조 하 시기 바 랍 니 다. Gexpr.
Matt Welsh & Lar Kaufman,Running Linux,USA:O'Reilly & Associates,1995
developerWorks Linux 전문 지역 에서 더 많은 것 을 찾 습 니 다. 리 눅 스 개발 자 에 게 사용 되 는 참고 자료
Liux 의 man page 도 중요 한 정보 원 입 니 다
http://www.ibm.com/developerworks/cn/linux/l-time/

좋은 웹페이지 즐겨찾기