2016-07-28 2 views
1

저는 현재 여러 짧은 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 프로그램 집합을 벤치 마크하는 정확한 방법입니까?

+0

실행 파일에는 C 코드가 아니라 기계어 코드가 들어 있습니다. C 태그는 완전히 관련이 없습니다. – Olaf

+0

'time' 쉘 내장은 좋은 옵션처럼 보입니다. 리눅스에서는'perf stat some_program'을 사용하여 명령어, 클럭 사이클, 캐시 미스, 분기 오 예측 (또는 카운터의 다른 세트는 기본값 일뿐입니다)에 대한 성능 카운터 수를 얻을 수 있습니다. –

답변

1

timeit은 실행되는 파이썬 프로세스에서 사용되는 CPU 시간을 측정합니다. 외부 프로세스의 실행 시간은 해당 시간에 "대변"되지 않습니다.

-1

보다 정확한 방법은 진정한 속도와 처리량을 얻을 수있는 C 언어로 할 수 있습니다.

+0

그건 제 백업 옵션입니다. 코드를 실행하고 실행하는 c 프로그램을 작성하고 subprocess를 사용하여 파이썬 스크립트에서 호출합니다. 처음에는 조금 지저분한 것처럼 보였지만 그렇게가는 길을 찾고 있습니다! –

+0

코드 자체에 타이머를 포함시킬 수 있습니다. – NWMG

관련 문제