system.time()과 proc.time()
R 표현식의 경과 시간, 사용자 시간 및 시스템 시간을 측정합니다.
system.time()과 proc.time()은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
성능을 측정하는 이유
코드를 최적화하기 전에 코드를 측정해야 합니다. 느린 부분이 어디에 있는지 추측하면 쓸데없는 작업을 하게 됩니다. R은 표현식의 실행 시간을 정확하게 측정하는 기본 제공 도구를 제공합니다.
주요 도구는 system.time(), proc.time(), Sys.time() 세 가지입니다. 각 도구는 성능 분석에서 서로 다른 목적을 수행합니다.
system.time() 기초
system.time(expr)은 표현식을 평가하고 실행에 걸린 시간을 반환합니다. R에서 단일 작업의 실행 시간을 측정하는 가장 간단한 방법입니다.
결과는 이름이 지정된 요소를 확인할 수 있는 proc_time 클래스의 객체입니다.
result <- system.time({
x <- 1:1000000
total <- sum(x)
})
print(result)세 가지 시간 값 읽기
system.time()은 다섯 개의 값을 반환하지만, 그중 가장 중요한 값은 세 가지입니다.
- user — R 코드 자체가 사용한 CPU 시간
- sys — 운영 체제가 R을 대신해 사용한 CPU 시간
- elapsed — 실제 경과 시간(지나간 실제 초)
대개 가장 중요한 값은 elapsed입니다. 여러 코어를 사용하는 컴퓨터에서는 user와 sys의 합이 elapsed보다 클 수 있습니다.
t <- system.time(Sys.sleep(0.1))
cat('user :', t['user.self'], '
')
cat('sys :', t['sys.self'], '
')
cat('elapsed:', t['elapsed'], '
')수동 시간 측정에 사용하는 proc.time()
proc.time()은 현재 CPU 시간과 경과 시간을 시점의 값으로 반환합니다. 코드 블록의 실행 전후에 이 값을 저장하면 임의의 코드 구간의 실행 시간을 측정할 수 있습니다.
시작 시점의 값을 종료 시점의 값에서 빼면 해당 구간의 경과 시간을 얻을 수 있습니다.
start <- proc.time()
for (i in 1:100000) sqrt(i)
end <- proc.time()
diff <- end - start
cat('elapsed:', diff['elapsed'], 'seconds
')proc.time() 구성 요소
proc.time()은 세 요소로 이루어진 이름 있는 숫자 벡터를 반환합니다.
user.self— R 프로세스의 사용자 CPU 시간sys.self— R 프로세스의 시스템 CPU 시간elapsed— R이 시작된 후의 실제 경과 시간
두 번의 proc.time() 호출 간 차이를 구하면 의미 있는 시간 차이를 얻을 수 있습니다.
pt <- proc.time()
cat('Names:', names(pt), '
')
cat('Values:', pt, '
')
cat('Class:', class(pt), '
')실제 시각 기록에 사용하는 Sys.time()
Sys.time()은 현재 날짜와 시간을 POSIXct 객체로 반환합니다. proc.time()과 달리 CPU 사용량만이 아니라 현실 세계의 시각을 제공합니다.
이 값은 어떤 일이 얼마나 오래 걸렸는지만이 아니라 언제 일어났는지를 기록하는 데 유용합니다.
start_time <- Sys.time()
cat('Start:', format(start_time), '
')
Sys.sleep(0.05)
end_time <- Sys.time()
cat('End :', format(end_time), '
')구간 측정에 사용하는 difftime()
difftime(end, start, units='secs')는 두 POSIXct 시각의 차이를 계산합니다. 단위는 'secs', 'mins', 'hours', 'days' 중에서 선택할 수 있습니다.
이 함수는 읽기 쉬운 시간 측정 결과를 얻기 위해 Sys.time()과 자연스럽게 함께 사용할 수 있습니다.
t1 <- Sys.time()
x <- cumsum(1:500000)
t2 <- Sys.time()
delta <- difftime(t2, t1, units = 'secs')
cat('Time taken:', round(as.numeric(delta), 4), 'seconds
')replicate()를 사용한 반복문 시간 측정
가비지 컬렉션이나 운영 체제의 일정 관리 때문에 한 번 측정한 시간은 달라질 수 있습니다. replicate(n, system.time(expr)['elapsed'])은 표현식을 여러 번 실행하고 경과 시간의 벡터를 반환합니다.
반복 측정값의 중앙값을 사용하면 더 안정적인 추정값을 얻을 수 있습니다.
times <- replicate(10, system.time({
x <- rnorm(10000)
mean(x)
})['elapsed'])
cat('Median elapsed:', median(times), 'seconds
')
cat('Range:', range(times), '
')두 가지 접근 방식 비교
system.time()을 사용하면 같은 작업을 구현한 두 방식을 직접 비교할 수 있습니다. 이 패턴을 사용하면 한 방식을 선택하기 전에 실제로 더 빠른지 확인할 수 있습니다.
n <- 100000
t_loop <- system.time({
result <- numeric(n)
for (i in seq_len(n)) result[i] <- i^2
})['elapsed']
t_vec <- system.time({
result <- seq_len(n)^2
})['elapsed']
cat('Loop :', t_loop, 's
')
cat('Vector :', t_vec, 's
')
cat('Speedup:', round(t_loop / max(t_vec, 1e-6), 1), 'x
')중첩된 작업의 시간 측정
system.time() 호출을 중첩하거나 작업 흐름 내부에서 proc.time() 체크포인트를 사용하면 어느 단계가 병목인지 파악할 수 있습니다.
스크립트가 실행되는 동안 중간 시간 차이를 출력하면 파이프라인의 시간 흐름을 구성할 수 있습니다.
p0 <- proc.time()
x <- rnorm(200000)
p1 <- proc.time()
y <- sort(x)
p2 <- proc.time()
z <- cumsum(y)
p3 <- proc.time()
cat('Generate:', (p1-p0)['elapsed'], 's
')
cat('Sort :', (p2-p1)['elapsed'], 's
')
cat('Cumsum :', (p3-p2)['elapsed'], 's
')시간 측정을 위한 실용적인 팁
R 코드의 실행 시간을 측정할 때 다음 방법을 기억해 두십시오.
- 시간을 측정하기 전에 코드를 한 번 실행하여 JIT와 파일 캐시를 준비합니다
- 시간을 측정하기 전에
gc()를 사용하여 가비지 컬렉션 상태를 초기화합니다 - 반복 측정에서는 평균보다 중앙값을 우선합니다 — GC로 인한 이상치가 평균을 왜곡합니다
- 전체 스크립트가 아니라 병목의 시간을 측정합니다
gc() # clear garbage before timing
times <- replicate(5, system.time({
m <- matrix(rnorm(1000 * 1000), nrow = 1000)
crossprod(m)
})['elapsed'])
cat('Median:', median(times), 's
')빠른 확인: system.time() 구성 요소
실행 중 실제로 경과한 실제 시각의 초를 나타내는 system.time() 구성 요소는 무엇입니까?
성능 시간 측정 요약
이제 base R에서 서로 보완되는 세 가지 시간 측정 도구를 사용할 수 있습니다.
system.time(expr)— 하나의 표현식 시간을 측정하는 가장 빠른 방법이며 user/sys/elapsed를 반환합니다proc.time()— 임의의 코드 블록을 시점의 값으로 측정합니다Sys.time()+difftime()— 실제 시각의 기록과 사람이 읽기 쉬운 시간 구간을 제공합니다
성능에 대한 결론을 내리기 전에 replicate()를 사용하여 안정적인 중앙값 측정값을 얻으십시오.
자주 묻는 질문
“system.time()과 proc.time()” 강의는 무료인가요?
네 — “system.time()과 proc.time()” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“system.time()과 proc.time()”에서 뭘 배우나요?
R 표현식의 경과 시간, 사용자 시간 및 시스템 시간을 측정합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
R Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“system.time()과 proc.time()” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- system.time()과 proc.time()
- Rprof와 profvis로 코드 프로파일링
- 속도를 위한 벡터화
- microbenchmark로 성능 벤치마킹