2016-07-31 12 views
0

Auf diesem Beispielcode:Warum berichten Perf-e-CPU-Zyklen unterschiedliche Antworten auf mehrere Läufe?

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout<<"Hello World!"<<endl; 

    return 0; 
} 

lief ich die folgenden Befehl 3 mal:

perf stat -e cpu-cycles ./sample 

Im Folgenden sind die 3 Ausgänge an aufeinander folgenden Ausführungen:

1)

Hello World! 

Performance counter stats for './try': 

    22,71,970  cpu-cycles    

    0.003634105 seconds time elapsed 

2)

Hello World! 

Performance counter stats for './try': 

    18,51,044  cpu-cycles    

    0.001045616 seconds time elapsed 

3)

Hello World! 

Performance counter stats for './try': 

    18,21,834  cpu-cycles    

    0.001153489 seconds time elapsed 

das gleiche Programm nimmt unterschiedliche Anzahl von CPU-Zyklen auf mehreren Läufen Warum sollte?

Ich verwende "Intel (R) Core (TM) i5-5250U CPU @ 1.60GHz", "Ubuntu 14.04.3 LTS" und "g ++ 4.8.4".

+0

Ich denke, dass diese Frage wieder geöffnet werden muss. Die verknüpfte Frage konzentriert sich hauptsächlich auf die Besonderheiten von "Schlaf". Ich glaube, dass die Variation in diesem Fall eine andere Erklärung hat. – Leon

+0

Zum einen macht Ihr Programm meistens I/O. d. h. Interaktion mit der äußeren (sich ständig verändernden und unvorhersehbaren) Welt. –

Antwort

1

Während des Anlaufens des Programms wird der Binär-Code ist Memory-Mapped aber geladen lazily (je nach Bedarf). Daher werden während des ersten Aufrufs des Programms einige CPU-Zyklen vom Kernel zum (transparenten) Laden des Binärcodes ausgegeben, während die Ausführung Anweisungsseiten erreicht, die noch nicht im RAM sind. Nachfolgende Aufrufe benötigen weniger Zeit, da sie den zwischengespeicherten Code wiederverwenden, es sei denn, die zugrunde liegende Datei wurde geändert oder das Programm wurde lange Zeit nicht mehr ausgeführt, und die Seiten wurden wiederverwendet.