timerate — 스크립트 실행 시간의 보정된 성능 측정
timerate — 스크립트 실행 시간의 보정된 성능 측정
time이 고정 횟수만큼 실행해 측정한다면, timerate는 고정 시간 동안 실행해서 더 정밀하게 측정하는 명령이에요. 측정 오버헤드까지 보정할 수 있어서 느린 스크립트나 실행 시간이 불확실한 스크립트를 재는 데 특히 유용해요.
본문
timerate script ?time? ?max-count?
timerate ?-direct? ?-overhead double? script ?time? ?max-count?
timerate ?-calibrate? ?-direct? script ?time? ?max-count?
timerate는 Tcl 명령이나 스크립트(script)의 보정된 성능 측정을 수행해요. script는 성능 측정 과정에서 여러 번 실행될 수 있도록 작성돼야 해요. 시간은 CPU 시간이 아니라 가장 정밀한 타이머 해상도로 경과 시간을 써서 측정해요. script가 OS와 상호작용하면 그 비용도 포함돼요. 이 명령은 스크립트나 Tcl 명령이 얼마나 잘 수행되는지에 대한 정보를 주고, 병목을 찾아내고 애플리케이션 성능을 다듬는 데 도움이 돼요.
첫 번째와 두 번째 형태는 주어진 time(밀리초) 간격이 지나갈 때까지, time을 지정하지 않으면 1000밀리초(1초) 동안 script를 평가해요.
max-count 매개변수는 최대 반복 횟수로 추가 제한을 걸 수도 있어요. max-count를 지정하면 그 횟수에 도달하거나 시간이 초과될 때 평가를 멈춰요.
그리고 다음과 같은 표준 Tcl 리스트를 반환해요.
0.095977 µs/# 52095836 # 10419167 #/sec 5000.000 net-ms
이는 다음을 뜻해요.
- 반복당 평균 시간(마이크로초):
[lindex $result 0] - 실행된 횟수:
[lindex $result 2] - 초당 추정 속도:
[lindex $result 4] - 측정 오버헤드를 제외한 추정 실제 실행 시간:
[lindex $result 6]
timerate에 줄 수 있는 옵션은 다음과 같아요.
-calibrate: 아주 빠른 스크립트를 최대한 정확하게 재려면 보정 과정이 필요할 수 있어요. 이 옵션은timerate자체를 보정하는 데 쓰여요. 주어진 스크립트의 추정 오버헤드를 앞으로의timerate호출을 위한 기본 오버헤드로 계산해요.time매개변수를 지정하지 않으면 보정 프로시저는 최대 10초 동안 실행돼요. 현재 구현에서 보정은 스레드 안전하지 않다는 점에 주의하세요.-overhead double: 각 반복의 측정 오버헤드 추정치(마이크로초)를 제공해요. 이 값은 현재timerate호출에서 이전 보정으로 추정된 오버헤드를 덮어써요. 오버헤드 자체도 뒤 예제에서처럼timerate로 측정할 수 있어요.-direct: 제공된 스크립트를 컴파일 없이 직접 실행해요.time명령과 비슷한 방식이에요.Tcl_EvalObjEx의 비용, 표준 리스트 호출 비용, 바이트코드 명령의 컴파일되지 않은 버전 비용을 재는 데 쓸 수 있어요.
time 명령이 테스트 스크립트를 고정 반복 횟수만큼 실행하는 것과 달리, timerate는 고정 시간 동안 실행해요. 게다가 -direct 옵션을 지정하지 않으면 스크립트의 컴파일된 버전이 측정 내내 사용돼요. 마치 스크립트가 컴파일된 프로시저의 일부인 것처럼요. 고정 시간과 컴파일 가능성 덕분에 더 정밀한 결과를 얻고 느린 스크립트가 아주 오래 걸리는 것을 막을 수 있어요. 그래서 실행 시간이 크게 불확실한 스크립트를 재는 데 실용적이에요.
예제
간단한 Tcl for 루프(변수 i 연산 포함)가 열까지 세는 속도를 측정해 볼게요.
# calibrate
timerate -calibrate {}
# measure
timerate { for {set i 0} {$i<10} {incr i} {} } 5000
루프를 제어하는 변수 관리의 오버헤드를 무시하고 측정하려면 이렇게 해요.
# calibrate for overhead of variable operations
set i 0; timerate -calibrate {expr {$i<10}; incr i} 1000
# measure
timerate {
for {set i 0} {$i<10} {incr i} {}
} 5000
clock format만으로 시간(시)을 계산하는 속도를, 계산을 준비하는 스크립트 부분의 오버헤드는 빼고 측정해 볼게요.
# calibrate
timerate -calibrate {}
# estimate overhead
set tm 0
set ovh [lindex [timerate -overhead 0 {
incr tm [expr {24*60*60}]
}] 0]
# measure using estimated overhead
set tm 0
timerate -overhead $ovh {
clock format $tm -format %H
incr tm [expr {24*60*60}]; # overhead for this is ignored
} 5000
마지막 예제에서 오버헤드 자체를 -overhead 0으로 호출한 timerate로 측정한 점에 주목하세요. 명시적 오버헤드는 절대값으로 가정되기 때문이에요. 즉 기본 보정 오버헤드에 대한 증가분이 아니에요. 그러므로 오버헤드 값을 측정할 때는 보정된 오버헤드가 제외되도록 하는 게 중요해요. 오버헤드를 측정할 때 -overhead 0을 넘겨서 이걸 달성해요.
더 알아보기
- time — 고정 반복 횟수로 실행 시간 측정