
프로세스가 얼마나 오래 실행되는지 알고 싶습니까? 리눅스 time 명령은 시간 통계를 반환하여 프로그램에서 사용하는 리소스에 대한 유용한 정보를 제공합니다.
시간에는 많은 친척이있다
많은 Linux 배포판과 다른 유닉스 계열 운영 체제가 있습니다. 이들 각각에는 기본 명령 쉘이 있습니다. 최신 Linux 배포판에서 가장 일반적인 기본 셸은 bash 셸입니다. 그러나 Z 쉘 (zsh) 및 Korn 쉘 (ksh)과 같은 다른 많은 것들이 있습니다.
이 모든 껍질은 자신의 것을 통합 time 명령은 내장 명령 또는 예약어로 사용됩니다. 입력 할 때 time 터미널 창에서 쉘은 GNU를 사용하는 대신 내부 명령을 실행합니다 time 바이너리는 Linux 배포판의 일부로 제공됩니다.
우리는 GNU 버전을 사용하고 싶습니다 time 더 많은 옵션이 있고 더 유연하기 때문입니다.
몇시에 달릴까요?
다음을 사용하여 실행할 버전을 확인할 수 있습니다. type 명령. type 쉘이 내부 루틴을 사용하여 명령 자체를 처리하는지 또는 GNU 바이너리로 전달하는지 여부를 알려줍니다.
터미널 창에서 단어를 입력하십시오 type, 공백, 그리고 단어 time Enter를 누르십시오.
type time

bash 쉘에서 볼 수 있습니다. time 예약어입니다. 이것은 Bash가 내부를 사용한다는 것을 의미합니다time 기본적으로 루틴.
type time

Z 쉘 (zsh)에서 time 예약어이므로 내부 셸 루틴이 기본적으로 사용됩니다.
type time

Korn 쉘에서 time 키워드입니다. GNU 대신 내부 루틴이 사용됩니다 time 명령.
관련 : ZSH 란 무엇이며 왜 Bash 대신 사용해야합니까?
GNU 시간 명령 실행
Linux 시스템의 쉘에 내부가있는 경우 time 일상적으로 GNU를 사용하려면 명시 적이어야합니다 time 이진. 다음 중 하나를 수행해야합니다.
- 바이너리에 대한 전체 경로를 제공하십시오 (예 :
/usr/bin/time. 실행which time이 경로를 찾기위한 명령입니다. - 사용하다
command time. - 같은 백 슬래시를 사용하십시오
time.

그만큼 which time 커맨드는 바이너리 경로를 알려줍니다.
우리는 이것을 사용하여 이것을 테스트 할 수 있습니다 /usr/bin/time GNU 바이너리를 시작하는 명령으로. 작동합니다. 우리는 time 명령 줄 매개 변수를 제공하지 않았다고 알려줍니다.
타자 command time 또한 작동하며 동일한 사용 정보를 time. 그만큼 command 명령은 쉘이 다음 명령을 무시하여 쉘 외부에서 처리되도록합니다.
사용하여 명령 이름 앞의 문자는 사용하는 것과 같습니다. command 명령 이름 앞에.
GNU를 사용하는 가장 간단한 방법 time 바이너리는 백 슬래시 옵션을 사용하는 것입니다.
time
time

time 호출 껍질 시간의 버전. time 사용 time 이진.
시간 명령 사용
몇 가지 프로그램을 시간을 보자. 우리는 두 개의 프로그램을 사용하고 있습니다 loop1 과 loop2. loop1.c 및 loop2.c에서 작성되었습니다. 그들은 한 가지 유형의 코딩 비효율의 영향을 보여주는 것 외에는 유용한 것을하지 않습니다.
이것은 loop1.c입니다. 문자열의 길이는 두 개의 중첩 루프 내에서 필요합니다. 길이는 두 개의 중첩 루프 외부에서 미리 확보됩니다.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main (int argc, char* argv())
{
int i, j, len, count=0;
char szString()="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";
// get length of string once, outside of loops
len = strlen( szString );
for (j=0; j<500000; j++) {
for (i=0; i < len; i++ ) {
if (szString(i) == '-')
count++;
}
}
printf("Counted %d hyphensn", count);
exit (0);
} // end of main
이것은 loop2.c입니다. 스트링의 길이는 외부 루프의 모든 사이클마다 시간이 지남에 따라 획득됩니다. 이 비 효율성은시기에 나타나야합니다.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main (int argc, char* argv())
{
int i, j, count=0;
char szString()="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";
for (j=0; j<500000; j++) {
// getting length of string every
// time the loops trigger
for (i=0; i < strlen(szString); i++ ) {
if (szString(i) == '-')
count++;
}
}
printf("Counted %d hyphensn", count);
exit (0);
} // end of main
발사하자 loop1 프로그램 및 사용 time 성능을 측정합니다.
time ./loop1

이제 똑같이 해봅시다 loop2.
time ./loop2

결과는 두 가지가 있지만 실제로는 추악한 형식입니다. 우리는 나중에 그것에 대해 무언가를 할 수 있지만 결과에서 약간의 정보를 선택합시다.
프로그램이 실행되면 두 가지 실행 모드가 전환됩니다. 이것들은 사용자 모드 과 커널 모드.
간단히 말해서, 사용자 모드의 프로세스는 자체 할당 외부의 하드웨어 또는 참조 메모리에 직접 액세스 할 수 없습니다. 이러한 리소스에 액세스하려면 프로세스가 커널에 요청해야합니다. 커널이 요청을 승인하면 프로세스는 요구 사항이 충족 될 때까지 커널 모드 실행으로 들어갑니다. 그런 다음 프로세스는 다시 사용자 모드 실행으로 전환됩니다.
에 대한 결과 loop1 우리에게 말해 loop1 사용자 모드에서 0.09 초를 보냈습니다. 커널 모드에서 제로 시간을 보냈거나 커널 모드에서 시간이 너무 작아서 반올림되면 등록 할 수 없습니다. 총 경과 시간은 0.1 초입니다. loop1 총 경과 시간 동안 CPU 시간의 평균 89 %를 받았습니다.
비효율적 인 loop2 프로그램을 실행하는 데 3 배 이상 걸렸습니다. 총 경과 시간은 0.3 초입니다. 사용자 모드에서 처리 시간은 0.29 초입니다. 커널 모드에 등록 된 것이 없습니다. loop2 실행 기간 동안 평균 96 %의 CPU 시간이 수여되었습니다.
출력 포맷팅
당신은 출력을 사용자 정의 할 수 있습니다 time 형식 문자열을 사용합니다. 형식 문자열은 텍스트 및 형식 지정자를 포함 할 수 있습니다. 형식 지정자 목록은 맨 페이지에서 찾을 수 있습니다. time. 각 형식 지정자는 정보를 나타냅니다.
문자열이 인쇄되면 형식 지정자가 실제 표시 값으로 바뀝니다. 예를 들어 CPU 백분율의 형식 지정자는 문자입니다. P . 표시하기 time 형식 지정자가 단순한 문자가 아니라 백분율 기호를 추가하십시오. %P . 예를 들어 보도록하겠습니다.
그만큼 -f (형식 문자열) 옵션은 time 뒤에 오는 것은 형식 문자열입니다.
형식 문자열은 문자“Program :”과 프로그램 이름 (및 프로그램에 전달하는 모든 명령 행 매개 변수)을 인쇄합니다. 그만큼 %C 형식 지정자는 "시간이 지정된 명령의 이름 및 명령 줄 인수"를 나타냅니다. 그만큼 n 출력이 다음 행으로 이동합니다.
많은 형식 지정자가 있으며 대소 문자를 구분하므로 직접 입력 할 때 입력해야합니다.
다음으로“Total time :”문자와이 프로그램 실행에 대한 총 경과 시간 값을 표시합니다 ( %E).
우리는 사용 n 또 다른 새로운 라인을 제공합니다. 그런 다음 "User Mode (s)"문자를 인쇄 한 다음 사용자 모드에서 소비 한 CPU 시간 값을 %U.
우리는 사용 n 또 다른 새로운 라인을 제공합니다. 이번에는 커널 시간 값을 준비하고 있습니다. “Kernel Mode (s)”문자와 그 뒤에 커널 모드에서 소비 된 CPU 시간의 형식 지정자를 인쇄합니다. %S.
마지막으로, 우리는 "nCPU :”를 사용하여이 데이터 값의 줄과 제목을 알려줍니다. 그만큼 %P format 지정자는 시간이 지정된 프로세스에서 사용 된 평균 CPU 시간 백분율을 제공합니다.
전체 형식 문자열은 따옴표로 묶습니다. 우리는 일부를 포함 할 수 t 값 정렬에 대해 까다로운 경우 출력에 탭을 배치 할 문자
time -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1

출력을 파일로 보내기
수행 한 테스트의 타이밍을 기록하기 위해 출력을 보낼 수 있습니다. time 파일로. 이렇게하려면 -o (출력) 옵션. 프로그램의 출력은 여전히 터미널 창에 표시됩니다. 의 출력입니다 time 파일로 리디렉션됩니다.
테스트를 다시 실행하고 출력을 test_results.txt 다음과 같이 정리하십시오 :
time -o test_results.txt -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1
cat test_results.txt

그만큼 loop1 프로그램 출력이 터미널 창에 표시되고 그 결과 time ~로 가다 test_results.txt 파일.
동일한 파일에서 다음 결과 세트를 캡처하려면 다음을 사용해야합니다. -a (추가) 옵션은 다음과 같습니다.
time -o test_results.txt -a -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop2
cat test_results.txt

우리가 왜 %C format 지정자는 형식 문자열의 출력에 프로그램 이름을 포함시킵니다.
그리고 우리는 시간이 없다
아마도 코드를 미세 조정하기 위해 프로그래머와 개발자에게 가장 많이 사용될 것입니다. time 명령은 프로그램을 시작할 때마다 어떤 일이 벌어지고 있는지에 대해 조금 더 알고 싶어하는 사람에게도 유용합니다.








