Linux / 명령어 / time - 명령 실행 시간 측정
time은 명령이나 파이프라인이 실행되는 데 걸린 시간과 CPU 사용 시간을 측정합니다. Bash의 time 예약어는 셸 내장 명령·함수·파이프라인까지 측정할 수 있고, 외부 GNU /usr/bin/time은 메모리와 입출력 같은 자세한 자원 사용량을 제공할 수 있습니다.
단순한 속도 확인에는 Bash time이 편리하고, 최대 메모리와 페이지 폴트 등 운영체제 수준의 통계가 필요하면 외부 time을 명시적으로 실행하는 것이 좋습니다.
time 명령어란?
Bash에서는 time이 일반 실행 파일보다 먼저 문법으로 인식되는 예약어입니다. 예약어이기 때문에 하나의 외부 프로그램뿐 아니라 파이프라인 전체, 셸 함수와 내장 명령도 자연스럽게 측정할 수 있습니다.
많은 Linux 시스템에는 별도로 GNU Time 실행 파일도 설치되어 있습니다. 같은 이름이지만 옵션과 출력 정보가 다르므로 다음 명령으로 현재 환경을 확인하세요.
type -a time command -V time ls -l /usr/bin/time
Bash time 기본 문법
time [-p] 명령 [인수 ...] time [-p] 명령1 | 명령2
측정할 명령 앞에 time을 붙입니다.
time sleep 1 time find /usr -type f >/dev/null
명령이 끝나면 일반적으로 real, user, sys 세 값이 표시됩니다.
real, user, sys의 의미
| 항목 | 의미 |
|---|---|
real |
시작부터 종료까지 실제로 흐른 경과 시간입니다. 디스크·네트워크 대기와 다른 프로세스 때문에 기다린 시간도 포함됩니다. |
user |
프로세스가 사용자 모드에서 CPU를 사용한 누적 시간입니다. |
sys |
프로세스를 위해 커널 모드에서 사용한 누적 CPU 시간입니다. |
여러 코어나 여러 프로세스를 병렬로 사용하면 user + sys가 real보다 클 수 있습니다. 반대로 입출력 대기가 길면 real은 크지만 CPU 시간은 작을 수 있습니다.
파이프라인 전체 측정하기
Bash 예약어 time은 뒤따르는 파이프라인 전체가 끝날 때까지 측정합니다.
time find /var/log -type f -print0 | xargs -0 wc -l >/dev/null
파이프라인의 첫 번째 명령만 별도로 측정하려면 그룹을 명확히 구성하거나 외부 도구를 사용할 때 측정 범위를 주의해야 합니다. 측정하려는 작업의 시작점과 종료점을 먼저 정하는 것이 중요합니다.
여러 명령을 하나의 작업으로 측정하기
명령 목록을 중괄호나 서브셸로 묶으면 전체 시간을 측정할 수 있습니다.
time {
make clean
make -j4
}
time ( cd /srv/app ./build.sh )
중괄호 그룹은 현재 셸에서 실행되고, 괄호 그룹은 서브셸에서 실행됩니다. 작업 중 디렉터리나 변수가 바뀌는 경우 이 차이를 고려하세요.
이식 가능한 출력 형식 -p
time -p sleep 1
-p는 POSIX 형식의 real, user, sys 출력을 사용합니다. 여러 시스템에서 결과를 단순하게 파싱해야 할 때 유용하지만, 로캘과 정밀도까지 포함한 자동화 요구 사항은 별도로 검토해야 합니다.
TIMEFORMAT으로 Bash 출력 바꾸기
Bash 예약어의 출력은 TIMEFORMAT 변수로 조정할 수 있습니다.
TIMEFORMAT='elapsed=%3R s user=%3U s sys=%3S s' time sleep 1
| 형식 | 의미 |
|---|---|
%R |
경과 시간 |
%U |
사용자 모드 CPU 시간 |
%S |
시스템 모드 CPU 시간 |
%P |
CPU 사용률을 백분율 형태로 표시 |
%% |
리터럴 퍼센트 기호 |
TIMEFORMAT은 현재 셸에 영향을 줍니다. 일회성으로 적용하려면 기존 값을 보관하거나 서브셸 안에서 설정하세요.
( TIMEFORMAT='elapsed=%R s' time ./job.sh )
외부 GNU time 사용하기
외부 명령의 옵션을 확실하게 사용하려면 전체 경로를 지정합니다.
/usr/bin/time ./job.sh /usr/bin/time -v ./job.sh
-v는 최대 상주 메모리, 페이지 폴트, 파일 시스템 입출력, 컨텍스트 전환 등 시스템이 제공하는 상세 정보를 출력합니다. 실제 제공 항목과 값은 운영체제에 따라 다를 수 있습니다.
GNU time의 자주 쓰는 옵션
| 옵션 | 설명 |
|---|---|
-p |
POSIX 형식으로 시간을 출력합니다. |
-v |
사용 가능한 자원 통계를 자세히 출력합니다. |
-f 형식 |
형식 지정자로 출력 내용을 구성합니다. |
-o 파일 |
측정 결과를 지정한 파일에 씁니다. |
-a |
-o 파일을 덮어쓰지 않고 뒤에 추가합니다. |
시간과 메모리만 원하는 형식으로 출력
/usr/bin/time -f 'elapsed=%e max_rss=%MKB' ./job.sh
%e는 경과 시간, %M은 최대 상주 메모리 크기를 나타냅니다. 단위와 지원 여부는 GNU Time 매뉴얼과 현재 시스템을 기준으로 확인하세요.
측정 결과를 파일에 저장
/usr/bin/time -v -o time-report.txt ./job.sh /usr/bin/time -v -a -o time-report.txt ./job.sh
-o를 사용하면 측정 대상 명령의 표준 오류와 시간 보고서를 분리할 수 있어 자동화에 편리합니다.
time 출력이 표준 오류로 나오는 이유
시간 정보는 기본적으로 표준 오류에 출력됩니다. 측정 대상 명령의 표준 출력이 파이프나 파일로 전달되어도 시간 결과가 섞이지 않게 하기 위한 동작입니다.
time ./job.sh >job-output.txt
이 명령은 작업의 표준 출력만 파일에 저장하고 시간 정보는 터미널에 표시합니다. Bash 예약어의 시간 정보만 따로 리디렉션하려면 그룹 전체의 표준 오류를 다루어야 하지만, 그러면 작업 자체의 표준 오류도 함께 들어갈 수 있습니다.
{ time ./job.sh >job-output.txt; } 2>time-and-errors.txt
시간 보고서만 분리하려면 외부 GNU Time의 -o가 더 명확합니다.
정확한 비교를 위한 주의점
- 첫 실행과 이후 실행은 파일 시스템 캐시, JIT 컴파일과 연결 재사용 때문에 다를 수 있습니다.
- 백그라운드 부하, CPU 주파수 조절과 가상 머신 자원 경쟁을 통제합니다.
- 매우 짧은 명령은 측정 자체의 오버헤드가 결과에 큰 영향을 줍니다.
- 여러 번 반복하고 중앙값이나 분포를 비교합니다.
- 출력 대상이 터미널인지 파일인지에 따라 실행 시간이 달라질 수 있습니다.
- 속도 차이가 실제 작업 결과나 오류율을 바꾸지 않는지도 함께 확인합니다.
Bash time과 /usr/bin/time 비교
| 구분 | Bash time |
GNU /usr/bin/time |
|---|---|---|
| 종류 | Bash 예약어 | 외부 실행 파일 |
| 파이프라인 | 전체 파이프라인을 직접 측정하기 쉽습니다. | 기본적으로 지정한 프로그램을 실행합니다. |
| 셸 함수·내장 명령 | 직접 측정할 수 있습니다. | 별도 셸을 거치지 않으면 직접 실행하기 어렵습니다. |
| 상세 자원 정보 | 기본 시간 통계 중심입니다. | -v로 메모리와 입출력 등의 통계를 제공합니다. |
| 출력 사용자화 | TIMEFORMAT |
-f, -o, -a |
자주 묻는 질문
real보다 user 시간이 더 클 수 있나요?
가능합니다. 여러 프로세스나 CPU 코어에서 사용한 CPU 시간이 누적되면 실제 경과 시간보다 사용자 CPU 시간이 커질 수 있습니다.
time -v가 동작하지 않습니다.
Bash 예약어가 먼저 해석되기 때문일 수 있습니다. GNU Time이 설치되어 있다면 /usr/bin/time -v 명령처럼 전체 경로를 사용하세요.
time은 명령의 종료 상태를 바꾸나요?
일반적으로 측정 대상 명령이나 파이프라인의 종료 상태를 반환합니다. 파이프라인에서는 Bash의 pipefail 설정에 따라 결과가 달라질 수 있습니다.









