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 설정에 따라 결과가 달라질 수 있습니다.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux 강좌 / 터미널과 셸 시작하기 - 명령어 구조와 도움말 읽기

Linux 강좌 / 터미널과 셸 시작하기 - 명령어 구조와 도움말 읽기

터미널과 셸의 차이부터 명령어·옵션·인수의 구조, 실행 결과 읽기, Bash 도움말 찾기까지 실습으로 익힙니다.

Linux / 명령어 / comm - 정렬된 두 파일의 공통·고유 행 비교

Linux / 명령어 / comm - 정렬된 두 파일의 공통·고유 행 비교

Linux comm 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / lscpu - CPU 아키텍처와 코어 정보 확인

Linux / 명령어 / lscpu - CPU 아키텍처와 코어 정보 확인

Linux lscpu 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / apt - Debian·Ubuntu에서 패키지 검색·설치·업데이트

Linux / 명령어 / apt - Debian·Ubuntu에서 패키지 검색·설치·업데이트

Linux apt 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / 명령어 / shutdown - 시스템 종료·재시작 예약과 취소

Linux / 명령어 / shutdown - 시스템 종료·재시작 예약과 취소

Linux shutdown 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / su - 사용자 계정 전환

Linux / 명령어 / su - 사용자 계정 전환

Linux su 명령어로 다른 사용자 권한의 셸과 단일 명령을 실행하는 방법을 설명합니다. su와 su --login 차이, 환경 변수, PAM 인증, sudo·runuser 선택 기준과 보안 주의사항을 정리합니다.

Linux / 명령어 / dmesg - 커널 메시지와 부팅 로그 확인

Linux / 명령어 / dmesg - 커널 메시지와 부팅 로그 확인

Linux dmesg 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / mount - 파일 시스템 연결 상태 확인과 마운트

Linux / 명령어 / mount - 파일 시스템 연결 상태 확인과 마운트

Linux mount 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / apt-get - APT 패키지 작업을 스크립트와 명령행에서 실행

Linux / 명령어 / apt-get - APT 패키지 작업을 스크립트와 명령행에서 실행

Linux apt-get 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / 명령어 / dnf - RPM 계열에서 패키지·저장소 관리

Linux / 명령어 / dnf - RPM 계열에서 패키지·저장소 관리

Linux dnf 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.