저는 현재 여러 짧은 C 프로그램에 대해 여러 벤치 마크를 생성해야하는 uni에서 일부 작업을 수행하고 있습니다. 이 프로세스를 자동화하기 위해 파이썬 스크립트를 작성했습니다. 나는에게 그러나파이썬 스크립트에서 C 프로그램을 벤치마킹하는 방법은 무엇입니까?
def run_program(path):
p = subprocess.Popen(path, shell=True, stdout=subprocess.PIPE)
p.communicate()[0]
if (p.returncode > 1):
return False
return True
다음 run_program
기능은 바로 C 프로그램을 실행하기 위해 subprocess
모듈을 사용
start = time.time()
successful = run_program(path)
end = time.time()
runtime = end - start
: 지금까지 내가 time
모듈을 사용하고 본질적으로 같은 벤치 마크를 계산 봤는데까지 최근에는 이것이 CPU 시간이 아닌 경과 된 시간을 측정한다는 것을 발견했습니다. 즉, 이러한 종류의 측정은 OS의 노이즈에 민감합니다. SO에 대한 비슷한 질문은 CPU 시간을 측정하는 것이 더 좋습니다 timeit
모듈이 제안, 그래서 나는 같은 실행 방법을 채택했습니다
def run_program(path):
command = 'p = subprocess.Popen(\'time ' + path + '\', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE); out, err = p.communicate()'
result = timeit.Timer(command, setup='import subprocess').repeat(1, 10)
return numpy.median(result)
그러나 timeit
문서보고에서이 timeit
모듈은 것 같다 문자열로 전달 된 작은 코드 조각을 의미합니다. 따라서 timeit
이 정확한 계산 결과를 제공하는지 확신 할 수 없습니다. 그래서 내 질문은 : timeit
은 실행되는 프로세스의 모든 단계에 대해 CPU를 측정 할 것인가 아니면 실제 파이썬 (예 : subprocess
모듈) 코드를 실행하기위한 CPU 시간 만 측정 할 것인가? 이 방법이 C 프로그램 집합을 벤치 마크하는 정확한 방법입니까?
실행 파일에는 C 코드가 아니라 기계어 코드가 들어 있습니다. C 태그는 완전히 관련이 없습니다. – Olaf
'time' 쉘 내장은 좋은 옵션처럼 보입니다. 리눅스에서는'perf stat some_program'을 사용하여 명령어, 클럭 사이클, 캐시 미스, 분기 오 예측 (또는 카운터의 다른 세트는 기본값 일뿐입니다)에 대한 성능 카운터 수를 얻을 수 있습니다. –