timerate — 스크립트 실행 시간의 보정된 성능 측정

timerate — 스크립트 실행 시간의 보정된 성능 측정

time이 고정 횟수만큼 실행해 측정한다면, timerate는 고정 시간 동안 실행해서 더 정밀하게 측정하는 명령이에요. 측정 오버헤드까지 보정할 수 있어서 느린 스크립트나 실행 시간이 불확실한 스크립트를 재는 데 특히 유용해요.

출처: Tcl 공식 문서 - 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 — 고정 반복 횟수로 실행 시간 측정