Linux에서 time 명령을 사용하는 방법

프로세스가 실행되는 시간과 훨씬 더 많은 시간을 알고 싶으십니까? Linux time 명령은 시간 통계를 반환하여 프로그램에서 사용하는 리소스에 대한 멋진 통찰력을 제공합니다.

시간에는 많은 친척이 있습니다

많은 Linux 배포판과 다양한 Unix 계열 운영 체제가 있습니다. 이들 각각에는 기본 명령 셸이 있습니다. 최신 Linux 배포판에서 가장 일반적인 기본 셸은 bash 셸입니다. 그러나 Z 쉘(zsh) 및 Korn 쉘(ksh)과 같은 다른 많은 것들이 있습니다.

이 모든 쉘은 자체 시간 명령을 통합합니다. 내장 명령 또는 예약어. 터미널 창에 시간을 입력하면 셸은 Linux 배포판의 일부로 제공되는 GNU 시간 바이너리를 사용하는 대신 내부 명령을 실행합니다.

우리는 더 많은 시간을 가지고 있기 때문에 GNU 버전의 시간을 사용하고자 합니다. 옵션 더 유연합니다.

몇시에 뛸까요?

type 명령을 사용하여 실행할 버전을 확인할 수 있습니다. type은 쉘이 내부 루틴과 함께 명령 자체를 처리할지 GNU 바이너리로 전달할지 알려줍니다.

터미널 창에서 type, space, time이라는 단어를 입력하고 Enter 키를 누릅니다.

type time

bash 쉘에서 시간이 예약어임을 알 수 있습니다. 이것은 Bash가 기본적으로 내부 시간 루틴을 사용한다는 것을 의미합니다.

type time

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

type time

Korn 쉘에서 시간은 키워드입니다. GNU 시간 명령 대신 내부 루틴이 사용됩니다.

GNU 시간 명령 실행

Linux 시스템의 셸에 내부 시간 루틴이 있는 경우 GNU 시간 바이너리를 사용하려면 명시적이어야 합니다. 다음 중 하나를 수행해야 합니다.

/usr/bin/time과 같은 바이너리의 전체 경로를 제공합니다. 이 경로를 찾으려면 which time 명령을 실행하십시오.
명령 시간을 사용합니다.
시간과 같이 백슬래시를 사용합니다.

which time 명령은 바이너리의 경로를 제공합니다.

  iPhone X에서 깨우기 위해 탭을 사용하는 방법

/usr/bin/time을 GNU 바이너리를 시작하는 명령으로 사용하여 이를 테스트할 수 있습니다. 작동합니다. time 명령에서 작동할 명령줄 매개변수를 제공하지 않았다는 응답을 받습니다.

입력 명령 시간도 작동하며 시간에서 동일한 사용 정보를 얻습니다. 명령 명령은 다음 명령을 무시하도록 쉘에 지시하여 쉘 외부에서 처리됩니다.

명령 이름 앞에 문자를 사용하는 것은 명령 이름 앞에 명령을 사용하는 것과 같습니다.

GNU 시간 바이너리를 사용하고 있는지 확인하는 가장 간단한 방법은 백슬래시 옵션을 사용하는 것입니다.

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

This is loop2.c. The length of the string is obtained time after time for every cycle of the outer loop. This inefficiency ought to show up in the timings.

#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

Let’s fire up the loop1 program and use time to measure its performance.

time ./loop1

이제 loop2에 대해서도 동일한 작업을 수행해 보겠습니다.

time ./loop2

그것은 우리에게 두 세트의 결과를 주었지만, 그것들은 정말 보기 흉한 형식입니다. 나중에 그것에 대해 뭔가를 할 수 있지만 결과에서 몇 가지 정보를 선택하겠습니다.

프로그램이 실행될 때 앞뒤로 전환되는 두 가지 실행 모드가 있습니다. 이를 사용자 모드와 커널 모드라고 합니다.

간단히 말해서, 사용자 모드의 프로세스는 자체 할당 외부의 하드웨어 또는 참조 메모리에 직접 액세스할 수 없습니다. 이러한 리소스에 액세스하려면 프로세스가 커널에 요청해야 합니다. 커널이 요청을 승인하면 요구 사항이 충족될 때까지 프로세스가 커널 모드 실행에 들어갑니다. 그런 다음 프로세스는 사용자 모드 실행으로 다시 전환됩니다.

loop1의 결과는 loop1이 사용자 모드에서 0.09초를 보냈다는 것을 알려줍니다. 커널 모드에서 0시간을 보냈거나 커널 모드에서 시간이 반내림되어 등록하기에 너무 낮은 값입니다. 총 경과 시간은 0.1초였습니다. loop1은 총 경과 시간 동안 평균 89%의 CPU 시간을 받았습니다.

비효율적인 loop2 프로그램은 실행하는 데 3배 더 오래 걸렸습니다. 총 경과 시간은 0.3초입니다. 사용자 모드에서 처리 시간은 0.29초입니다. 커널 모드에 등록된 것이 없습니다. loop2는 실행 기간 동안 평균 96%의 CPU 시간을 받았습니다.

출력 형식 지정

형식 문자열을 사용하여 시간의 출력을 사용자 정의할 수 있습니다. 형식 문자열에는 텍스트 및 형식 지정자가 포함될 수 있습니다. 형식 지정자 목록은 다음과 같습니다. 맨 페이지에서 찾은 시간 동안. 각 형식 지정자는 정보를 나타냅니다.

문자열이 인쇄될 때 형식 지정자는 그들이 나타내는 실제 값으로 대체됩니다. 예를 들어 CPU 백분율에 대한 형식 지정자는 문자 P 입니다. 형식 지정자가 일반 문자가 아님을 시간에 나타내려면 %P 와 같이 백분율 기호를 추가하십시오. 예제로 사용해 보겠습니다.

-f(형식 문자열) 옵션은 다음에 오는 것이 형식 문자열임을 시간에 알리는 데 사용됩니다.

형식 문자열은 "Program:" 문자와 프로그램 이름(및 프로그램에 전달하는 모든 명령줄 매개변수)을 인쇄합니다. %C 형식 지정자는 "시간이 지정되는 명령의 이름 및 명령줄 인수"를 나타냅니다. n은 출력이 다음 줄로 이동하도록 합니다.

형식 지정자가 많이 있으며 대소문자를 구분하므로 직접 이 작업을 수행할 때 올바르게 입력했는지 확인하십시오.

다음으로 "Total time:" 문자를 출력하고 이 프로그램 실행에 대한 총 경과 시간 값(%E로 표시)을 출력합니다.

우리는 n을 사용하여 또 다른 새 줄을 제공합니다. 그런 다음 "User Mode(s)" 문자를 인쇄하고 %U로 표시되는 사용자 모드에서 보낸 CPU 시간 값을 인쇄합니다.

우리는 n을 사용하여 또 다른 새 줄을 제공합니다. 이번에는 커널 시간 값을 준비합니다. "Kernel Mode(s)" 문자를 출력하고 그 뒤에 커널 모드에서 보낸 CPU 시간에 대한 형식 지정자, 즉 %S를 인쇄합니다.

마지막으로 이 데이터 값에 대한 새 줄과 제목을 제공하기 위해 "nCPU:" 문자를 인쇄할 것입니다. %P 형식 지정자는 시간이 지정된 프로세스에서 사용하는 CPU 시간의 평균 백분율을 제공합니다.

전체 형식 문자열은 따옴표로 묶입니다. 값 정렬이 까다롭다면 출력에 탭을 배치하기 위해 일부 t 문자를 포함할 수 있었습니다.

time -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1

출력을 파일로 보내기

수행한 테스트의 타이밍을 기록하기 위해 출력을 파일로 보낼 수 있습니다. 이렇게 하려면 -o(출력) 옵션을 사용합니다. 프로그램의 출력은 여전히 ​​터미널 창에 표시됩니다. 파일로 리디렉션되는 것은 시간의 출력뿐입니다.

테스트를 다시 실행하고 다음과 같이 출력을 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 프로그램 출력은 터미널 창에 표시되고 시간의 결과는 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 형식 지정자를 사용한 이유가 분명해졌습니다.

그리고 우리는 시간이 없습니다

프로그래머와 개발자가 코드를 미세 조정하는 데 가장 많이 사용하는 time 명령은 프로그램을 시작할 때마다 내부에서 일어나는 일에 대해 조금 더 알고 싶은 사람에게도 유용합니다.