Measuring Cost

Timing a Run


실행 시간(running time)은 프로그램이 실행을 시작해 끝낼 때까지 걸린 시간이다. 호출을 여러 번 묶어 재고, 묶음 시간을 호출당 시간으로 바꾼 뒤 중앙값으로 요약한다.

실측(benchmark)코드를 실행해 걸린 시간을 잰다. 같은 결과를 내는 구현도 시간은 다를 수 있다.
반복 묶음짧은 호출을 여러 번 실행해 한 묶음으로 잰다.
호출당 중앙값묶음 시간을 호출 수로 나누고 가운데 값을 쓴다.

측정 구간과 반복 묶음을 한 계산으로 연결한다

세 함수는 모두 1 + 2 + ··· + n을 반환한다. 함수와 입력 크기, 묶음당 호출 수, 반복 묶음 수를 바꾸면 묶음 시간과 호출당 환산값, 중앙값이 함께 바뀐다.

측정 전 확인 · 시간에서 제외

assert sum_loop(n) == n * (n + 1) // 2

틀린 답을 빨리 내는 코드는 비교 대상이 아니므로 결과부터 확인한다. 목록을 읽는 코드를 잴 때는 목록 생성도 setup에 두어 측정에서 뺀다.

측정 구간 · Timer가 기록

Timer(lambda: sum_loop(10000)).repeat(repeat=5, number=10)

같은 입력으로 호출만 묶어 잰다.

초록 묶음이 중앙값 위치다(묶음 수가 짝수면 가운데 두 값의 평균). 중앙값은 한 컴퓨터에서 잰 호출당 시간이다. 묶음별 값은 sum_loop, n = 10,000, 5묶음에서 잰 다섯 값이고, 다른 조건에서는 그 다섯 값의 흩어짐 비율을 중앙값에 적용해 계산한 값이다.

비교 조건 가운데 하나가 달라지면 해석도 달라진다

실행 시간을 비교하려면 코드뿐 아니라 컴퓨터, 측정 범위와 입력 크기도 같아야 한다.

컴퓨터

측정 범위

입력 크기

초록 테두리 카드는 두 측정에서 조건을 맞춘 항목이고, 빨간 테두리 카드는 조건이 달라 코드 차이와 섞이는 항목이다.