2016-07-28 2 views
1

В настоящее время я выполняю работу в uni, которая требует создания нескольких тестов для нескольких коротких программ на C. Я написал сценарий python для автоматизации этого процесса. До сих пор я использовал time модуль и, по существу вычисления тест как таковой:Как сравнить программу C с скриптом python?

start = time.time() 
successful = run_program(path) 
end = time.time() 

runtime = end - start 

где функция run_program просто использует subprocess модуль для запуска программы 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 

Однако я Недавно было обнаружено, что эти меры истекли, а не процессорное время, т. е. такое измерение чувствительно к шуму от ОС. Аналогичные вопросы на SO предположить, что 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 модуль только предназначенный для небольших фрагментов кода python, переданных в виде строки. Поэтому я не уверен, что timeit дает мне точные результаты для этого вычисления. Поэтому мой вопрос: будет ли timeit измерять процессор для каждого шага процесса, который он запускает, или будет только измерять время процессора для фактического кода python (то есть модуля subprocess) для запуска? Является ли это точным способом тестирования набора программ на C?

+0

Исполняемый файл содержит машинный код, а не код C. Тег C полностью не имеет значения. – Olaf

+0

Встроенная оболочка 'time' выглядит как хороший вариант. В Linux вы также можете использовать 'perf stat some_program', чтобы получить счетчик счетчиков производительности для инструкций, тактовых циклов, промахов кэш-памяти и неверных прогнозов ветки (или любого другого набора счетчиков, это только значения по умолчанию) –

ответ

1

timeit будет измерять время процессора, используемое процессом Python, в котором он выполняется. Время выполнения внешних процессов не будет «зачислено» к тем временам.

-1

Более точным способом было бы сделать это на C, где вы можете получить истинную скорость и пропускную способность.

+0

Это мой вариант резервного копирования; Напишите программу c, которая раз и запускает код, и используйте подпроцесс, чтобы вызвать это из моего сценария python. Сначала было немного грязно, но похоже, что это путь! –

+0

вы можете встроить таймер в сам код – NWMG

Смежные вопросы