В настоящее время я выполняю работу в 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?
Исполняемый файл содержит машинный код, а не код C. Тег C полностью не имеет значения. – Olaf
Встроенная оболочка 'time' выглядит как хороший вариант. В Linux вы также можете использовать 'perf stat some_program', чтобы получить счетчик счетчиков производительности для инструкций, тактовых циклов, промахов кэш-памяти и неверных прогнозов ветки (или любого другого набора счетчиков, это только значения по умолчанию) –