Heim > Artikel > Backend-Entwicklung > Wie misst man die Prozessor- und Echtzeit-Ausführungsdauer unter Linux und Windows?
So messen Sie die Prozessor- und Echtzeit-Ausführungsdauer unter Linux und Windows
Die Bestimmung der CPU- und Echtzeit-Ausführungsdauer eines Programms ist von entscheidender Bedeutung zur Leistungsoptimierung. Hier erfahren Sie, wie Sie dies unter Linux und Windows erreichen und dabei sowohl x86- als auch x86_64-Architekturen unterstützen.
Funktionsausführung und Messung der Wall-Clock-Zeit
Um die von Ihnen verbrauchte CPU-Zeit zu messen Um die Funktion und die Zeit, die die Uhr zum Ausführen benötigt, zu ermitteln, verwenden Sie Folgendes Code:
int startcputime, endcputime, wcts, wcte; startcputime = cputime(); function(args); endcputime = cputime(); std::cout << "it took " << endcputime - startcputime << " s of CPU to execute this\n"; wcts = wallclocktime(); function(args); wcte = wallclocktime(); std::cout << "it took " << wcte - wcts << " s of real time to execute this\n";
Plattformunabhängige Architektur
Der vorgestellte Zeitmessansatz ist architekturunabhängig, d. h. er kann über verschiedene Prozessorarchitekturen hinweg implementiert werden und konsistente Ergebnisse liefern .
Implementierung
Hier ist eine vielseitige Lösung, die funktioniert Windows und Linux in C und C:
// Windows #ifdef _WIN32 #include <Windows.h> double get_wall_time(){ LARGE_INTEGER time, freq; if (!QueryPerformanceFrequency(&freq)){ // Handle error return 0; } if (!QueryPerformanceCounter(&time)){ // Handle error return 0; } return (double)time.QuadPart / freq.QuadPart; } double get_cpu_time(){ FILETIME a, b, c, d; if (GetProcessTimes(GetCurrentProcess(), &a, &b, &c, &d) != 0){ // Returns total user time. // Can be tweaked to include kernel times as well. return (double)(d.dwLowDateTime | ((unsigned long long)d.dwHighDateTime << 32)) * 0.0000001; }else{ // Handle error return 0; } } // Linux #else #include <time.h> #include <sys/time.h> double get_wall_time(){ struct timeval time; if (gettimeofday(&time, NULL)){ // Handle error return 0; } return (double)time.tv_sec + (double)time.tv_usec * .000001; } double get_cpu_time(){ return (double)clock() / CLOCKS_PER_SEC; } #endif
Spezifische Plattformimplementierung:
Windows:
Linux:
Demonstration
Hier ist ein einfaches Beispiel, das die Implementierung zeigt:
#include <math.h> #include <iostream> using namespace std; int main(){ // Start Timers double wall0 = get_wall_time(); double cpu0 = get_cpu_time(); // Computational task (e.g., numerical summation). double sum = 0; #pragma omp parallel for reduction(+ : sum) for (long long i = 1; i < 10000000000; i++){ sum += log((double)i); } // Stop timers double wall1 = get_wall_time(); double cpu1 = get_cpu_time(); cout << "Wall Time = " << wall1 - wall0 << endl; cout << "CPU Time = " << cpu1 - cpu0 << endl; // Prevent code elimination (optimization). cout << endl; cout << "Sum = " << sum << endl; }
Dieser Code misst die durch eine hypothetische numerische Summierung benötigte Wanduhr- und CPU-Zeit.
Das obige ist der detaillierte Inhalt vonWie misst man die Prozessor- und Echtzeit-Ausführungsdauer unter Linux und Windows?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!