2016-07-28 23 views
1

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?

+0

Eine ausführbare Datei enthält Maschinencode, nicht C-Code. Das C-Tag ist völlig irrelevant. – Olaf

+0

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. –

Antwort

1

timeit wird die CPU-Zeit von dem Python-Prozess, in dem es ausgeführt wird, messen. Die Ausführungszeit von externen Prozessen wird diesen Zeiten nicht "gutgeschrieben".

-1

Ein genauerer Weg wäre es in C, wo Sie echte Geschwindigkeit und Durchsatz erhalten können.

+0

Das ist meine Backup-Option; Schreiben Sie ein c-Programm, das den Code zeitsynchronisiert und ausführt, und verwenden Sie subprocess, um das von meinem Python-Skript aus aufzurufen. Sah am Anfang ein bisschen unordentlich aus, aber es sieht so aus, als ob das der richtige Weg ist! –

+0

können Sie den Timer in den Code selbst einbetten – NWMG