Heim  >  Artikel  >  Backend-Entwicklung  >  Wie misst man die Prozessor- und Echtzeit-Ausführungsdauer unter Linux und Windows?

Wie misst man die Prozessor- und Echtzeit-Ausführungsdauer unter Linux und Windows?

Barbara Streisand
Barbara StreisandOriginal
2024-11-13 02:45:021004Durchsuche

How to Measure Processor and Real-Time Execution Duration on Linux and 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:

    • Wandzeit: Leistungsindikatoren
    • CPU-Zeit: GetProcessTimes()
  • Linux:

    • Wall Time: gettimeofday()
    • CPU-Zeit: clock()

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn