Ich mache derzeit einige Arbeit in Uni, die mehrere Benchmarks für mehrere kurze C-Programme generieren müssen. Ich habe ein Python-Skript geschrieben, um diesen Prozess zu automatisieren. Bis jetzt habe ich, das time
-Modul und im Wesentlichen die Benchmark als solche Berechnung:Wie Benchmark ein C-Programm von einem Python-Skript?
start = time.time()
successful = run_program(path)
end = time.time()
runtime = end - start
wo die run_program
Funktion nur verwendet das subprocess
Modul das C-Programm auszuführen:
def run_program(path):
p = subprocess.Popen(path, shell=True, stdout=subprocess.PIPE)
p.communicate()[0]
if (p.returncode > 1):
return False
return True
ich jedoch habe kürzlich entdeckt, dass dies die verstrichene Zeit und nicht die CPU-Zeit misst, dh diese Art von Messung ist empfindlich gegenüber Rauschen vom Betriebssystem. Ähnliche Fragen vorschlagen, so dass die timeit
Modul ist, CPU-Zeit für die Messung ist besser so habe ich die run-Methode als solche angepasst:
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)
Aber am timeit
Dokumentation aus der Betrachtung scheint es, dass das timeit
Modul ist nur gedacht für kleine Snippets von Python-Code, der als String übergeben wird. Also bin ich mir nicht sicher, ob timeit
mir genaue Ergebnisse für diese Berechnung gibt. Meine Frage ist also: Wird timeit
die CPU für jeden Schritt des Prozesses messen, den es ausführt, oder wird es nur die CPU-Zeit messen, damit der tatsächliche Python-Code (d. H. Der subprocess
-Modul) ausgeführt wird? Ist dies eine genaue Methode, um eine Reihe von C-Programmen zu benchmarken?
Eine ausführbare Datei enthält Maschinencode, nicht C-Code. Das C-Tag ist völlig irrelevant. – Olaf
Die eingebaute 'time'-Shell sieht nach einer guten Option aus. Unter Linux können Sie auch 'perf stat some_program' verwenden, um Leistungszählungen für Anweisungen, Taktzyklen, Cache-Fehler und Verzweigungsfehlvorgaben (oder einen anderen Satz von Zählern, das sind nur die Standardwerte) zu erhalten. –