ホームページ  >  記事  >  バックエンド開発  >  Linux および Windows でプロセッサーとリアルタイム実行時間を測定する方法は?

Linux および Windows でプロセッサーとリアルタイム実行時間を測定する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-13 02:45:021049ブラウズ

How to Measure Processor and Real-Time Execution Duration on Linux and Windows?

Linux および Windows でプロセッサーとリアルタイム実行時間を測定する方法

プログラムの CPU とリアルタイム実行時間を決定することが重要ですパフォーマンスの最適化のために。 x86 と x86_64 の両方のアーキテクチャをサポートする Linux と Windows でこれを実現する方法は次のとおりです。

関数の実行と実時間の測定

使用した CPU 時間を測定するには関数と実行にかかる実時間を確認するには、次のコードを使用します。

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";

プラットフォームに依存しないアーキテクチャ

提示された時間測定アプローチはアーキテクチャに依存しません。これは、異なるプロセッサ アーキテクチャ間で実装して一貫した結果を提供できることを意味します。

実装

ここでは、C と C の両方で Windows と Linux で機能する多用途のソリューションを示します。

//  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

特定のプラットフォーム実装:

  • Windows:

    • ウォール タイム: パフォーマンス カウンター
    • CPU 時間: GetProcessTimes()
  • Linux:

    • ウォール タイム: gettimeofday()
    • CPU 時間: Clock()

デモ

実装を示す簡単な例を次に示します。

#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;
}

このコード仮想の数値合計によって実時間と CPU 時間を測定します。

以上がLinux および Windows でプロセッサーとリアルタイム実行時間を測定する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。