最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)獲取指定代碼段的cpu占用

 更新時(shí)間:2023年12月28日 10:24:52   作者:BuffaloX_X  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)獲取指定代碼段的cpu占用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下

windows

#include <iostream>
#include <windows.h>
#include <vector>
 
class CodeSegmentCPUMonitor {
public:
    static CodeSegmentCPUMonitor& getInstance() {
        static CodeSegmentCPUMonitor instance;
        return instance;
    }
 
    ~CodeSegmentCPUMonitor() {
        // 獲取結(jié)束性能計(jì)數(shù)器值
        QueryPerformanceCounter(&endCounter);
 
        // 計(jì)算運(yùn)行時(shí)間(秒)
        double elapsedTime = static_cast<double>(endCounter.QuadPart - startCounter.QuadPart) / frequency.QuadPart;
 
        // 計(jì)算 CPU 平均占用
        double averageCPUUsage = (totalCycles / elapsedTime) * 100.0 / processorSpeed;
 
        std::cout << "Total Average CPU Usage: " << averageCPUUsage << "%\n";
    }
 
    void enterCodeSegment() {
        // 進(jìn)入代碼段時(shí)記錄開(kāi)始時(shí)間
        QueryPerformanceCounter(&codeSegmentStartCounter);
    }
 
    void exitCodeSegment() {
        // 退出代碼段時(shí)記錄結(jié)束時(shí)間
        QueryPerformanceCounter(&codeSegmentEndCounter);
 
        // 計(jì)算代碼段的 CPU 占用
        ULONGLONG codeSegmentCycles = codeSegmentEndCounter.QuadPart - codeSegmentStartCounter.QuadPart;
        totalCycles += codeSegmentCycles;
    }
 
private:
    LARGE_INTEGER frequency;
    LARGE_INTEGER startCounter;
    LARGE_INTEGER endCounter;
 
    LARGE_INTEGER codeSegmentStartCounter;
    LARGE_INTEGER codeSegmentEndCounter;
 
    ULONGLONG totalCycles = 0;
 
    // 假設(shè)處理器速度為 2.5 GHz,你需要根據(jù)實(shí)際情況調(diào)整這個(gè)值
    const double processorSpeed = 2.5e9;
 
    CodeSegmentCPUMonitor() {
        // 獲取性能計(jì)數(shù)器頻率
        if (QueryPerformanceFrequency(&frequency)) {
            // 獲取初始性能計(jì)數(shù)器值
            QueryPerformanceCounter(&startCounter);
        } else {
            std::cerr << "Failed to get performance counter frequency.\n";
        }
    }
 
    // 禁用拷貝構(gòu)造函數(shù)和賦值運(yùn)算符
    CodeSegmentCPUMonitor(const CodeSegmentCPUMonitor&) = delete;
    CodeSegmentCPUMonitor& operator=(const CodeSegmentCPUMonitor&) = delete;
};
 
int main() {
    // Example: Measure CPU usage for code segment 1
    {
        CodeSegmentCPUMonitor::getInstance().enterCodeSegment();
 
        // Your code segment 1 here
 
        CodeSegmentCPUMonitor::getInstance().exitCodeSegment();
    }
 
    // Example: Measure CPU usage for code segment 2
    {
        CodeSegmentCPUMonitor::getInstance().enterCodeSegment();
 
        // Your code segment 2 here
 
        CodeSegmentCPUMonitor::getInstance().exitCodeSegment();
    }
 
    // ... Add more code segments as needed ...
 
    return 0;
}

linux

#include <iostream>
#include <vector>
#include <ctime>
 
class CodeSegmentCPUMonitor {
public:
    static CodeSegmentCPUMonitor& getInstance() {
        static CodeSegmentCPUMonitor instance;
        return instance;
    }
 
    ~CodeSegmentCPUMonitor() {
        // 獲取結(jié)束時(shí)間
        struct timespec endTime;
        clock_gettime(CLOCK_MONOTONIC, &endTime);
 
        // 計(jì)算運(yùn)行時(shí)間(秒)
        double elapsedTime = static_cast<double>(endTime.tv_sec - startTime.tv_sec) +
                             static_cast<double>(endTime.tv_nsec - startTime.tv_nsec) / 1e9;
 
        // 計(jì)算 CPU 平均占用
        double averageCPUUsage = (totalCycles / elapsedTime) * 100.0 / processorSpeed;
 
        std::cout << "Total Average CPU Usage: " << averageCPUUsage << "%\n";
    }
 
    void enterCodeSegment() {
        // 進(jìn)入代碼段時(shí)記錄開(kāi)始時(shí)間
        clock_gettime(CLOCK_MONOTONIC, &codeSegmentStartTime);
    }
 
    void exitCodeSegment() {
        // 退出代碼段時(shí)記錄結(jié)束時(shí)間
        struct timespec codeSegmentEndTime;
        clock_gettime(CLOCK_MONOTONIC, &codeSegmentEndTime);
 
        // 計(jì)算代碼段的 CPU 占用
        double codeSegmentElapsedTime = static_cast<double>(codeSegmentEndTime.tv_sec - codeSegmentStartTime.tv_sec) +
                                        static_cast<double>(codeSegmentEndTime.tv_nsec - codeSegmentStartTime.tv_nsec) / 1e9;
        totalCycles += codeSegmentElapsedTime;
    }
 
private:
    struct timespec startTime;
    struct timespec codeSegmentStartTime;
 
    double totalCycles = 0;
 
    // 假設(shè)處理器速度為 2.5 GHz,你需要根據(jù)實(shí)際情況調(diào)整這個(gè)值
    const double processorSpeed = 2.5e9;
 
    CodeSegmentCPUMonitor() {
        // 獲取初始時(shí)間
        clock_gettime(CLOCK_MONOTONIC, &startTime);
    }
 
    // 禁用拷貝構(gòu)造函數(shù)和賦值運(yùn)算符
    CodeSegmentCPUMonitor(const CodeSegmentCPUMonitor&) = delete;
    CodeSegmentCPUMonitor& operator=(const CodeSegmentCPUMonitor&) = delete;
};
 
int main() {
    // Example: Measure CPU usage for code segment 1
    {
        CodeSegmentCPUMonitor::getInstance().enterCodeSegment();
 
        // Your code segment 1 here
 
        CodeSegmentCPUMonitor::getInstance().exitCodeSegment();
    }
 
    // Example: Measure CPU usage for code segment 2
    {
        CodeSegmentCPUMonitor::getInstance().enterCodeSegment();
 
        // Your code segment 2 here
 
        CodeSegmentCPUMonitor::getInstance().exitCodeSegment();
    }
 
    // ... Add more code segments as needed ...
 
    return 0;
}

linux和windows條件編譯

#include <iostream>
 
#ifdef _WIN32
#include <windows.h>
#else
#include <ctime>
#endif
 
class CodeSegmentCPUMonitor {
public:
    static CodeSegmentCPUMonitor& getInstance() {
        static CodeSegmentCPUMonitor instance;
        return instance;
    }
 
    ~CodeSegmentCPUMonitor() {
#ifdef _WIN32
        FILETIME endTime;
        GetSystemTimeAsFileTime(&endTime);
        ULARGE_INTEGER endTime64;
        endTime64.LowPart = endTime.dwLowDateTime;
        endTime64.HighPart = endTime.dwHighDateTime;
        double elapsedTime = static_cast<double>(endTime64.QuadPart - startTime.QuadPart) / frequency.QuadPart;
#else
        struct timespec endTime;
        clock_gettime(CLOCK_MONOTONIC, &endTime);
        double elapsedTime = static_cast<double>(endTime.tv_sec - startTime.tv_sec) +
                             static_cast<double>(endTime.tv_nsec - startTime.tv_nsec) / 1e9;
#endif
 
        double averageCPUUsage = (totalCycles / elapsedTime) * 100.0 / processorSpeed;
 
        std::cout << "Total Average CPU Usage: " << averageCPUUsage << "%\n";
    }
 
    void enterCodeSegment() {
#ifdef _WIN32
        GetSystemTimeAsFileTime(&codeSegmentStartTime);
#else
        clock_gettime(CLOCK_MONOTONIC, &codeSegmentStartTime);
#endif
    }
 
    void exitCodeSegment() {
#ifdef _WIN32
        FILETIME codeSegmentEndTime;
        GetSystemTimeAsFileTime(&codeSegmentEndTime);
        ULARGE_INTEGER codeSegmentEndTime64;
        codeSegmentEndTime64.LowPart = codeSegmentEndTime.dwLowDateTime;
        codeSegmentEndTime64.HighPart = codeSegmentEndTime.dwHighDateTime;
        double codeSegmentElapsedTime = static_cast<double>(codeSegmentEndTime64.QuadPart - codeSegmentStartTime.QuadPart) / frequency.QuadPart;
#else
        struct timespec codeSegmentEndTime;
        clock_gettime(CLOCK_MONOTONIC, &codeSegmentEndTime);
        double codeSegmentElapsedTime = static_cast<double>(codeSegmentEndTime.tv_sec - codeSegmentStartTime.tv_sec) +
                                        static_cast<double>(codeSegmentEndTime.tv_nsec - codeSegmentStartTime.tv_nsec) / 1e9;
#endif
 
        totalCycles += codeSegmentElapsedTime;
    }
 
private:
#ifdef _WIN32
    LARGE_INTEGER frequency;
    LARGE_INTEGER startTime;
    FILETIME codeSegmentStartTime;
#else
    struct timespec startTime;
    struct timespec codeSegmentStartTime;
#endif
 
    double totalCycles = 0;
    const double processorSpeed = 2.5e9;
 
    CodeSegmentCPUMonitor() {
#ifdef _WIN32
        QueryPerformanceFrequency(&frequency);
        QueryPerformanceCounter(&startTime);
#else
        clock_gettime(CLOCK_MONOTONIC, &startTime);
#endif
    }
 
    CodeSegmentCPUMonitor(const CodeSegmentCPUMonitor&) = delete;
    CodeSegmentCPUMonitor& operator=(const CodeSegmentCPUMonitor&) = delete;
};
 
int main() {
    // Example: Measure CPU usage for code segment 1
    {
        CodeSegmentCPUMonitor::getInstance().enterCodeSegment();
 
        // Your code segment 1 here
 
        CodeSegmentCPUMonitor::getInstance().exitCodeSegment();
    }
 
    // Example: Measure CPU usage for code segment 2
    {
        CodeSegmentCPUMonitor::getInstance().enterCodeSegment();
 
        // Your code segment 2 here
 
        CodeSegmentCPUMonitor::getInstance().exitCodeSegment();
    }
 
    // ... Add more code segments as needed ...
 
    return 0;
}

解耦log接口的形式1

#include <iostream>
#include <string>
 
// CPU Monitor Output Interface
class CPUMonitorOutputInterface {
public:
    virtual ~CPUMonitorOutputInterface() {}
    virtual void log(const std::string& message) = 0;
};
 
// ConsoleLogger: 實(shí)現(xiàn)CPUMonitorOutputInterface的一個(gè)Logger類(lèi)示例
class ConsoleLogger : public CPUMonitorOutputInterface {
public:
    void log(const std::string& message) override {
        std::cout << "Logger: " << message << std::endl;
    }
};
 
class CodeSegmentCPUMonitor {
public:
    CodeSegmentCPUMonitor(CPUMonitorOutputInterface& logger) : logger(logger) {
#ifdef _WIN32
        QueryPerformanceFrequency(&frequency);
        QueryPerformanceCounter(&startTime);
#else
        clock_gettime(CLOCK_MONOTONIC, &startTime);
#endif
    }
 
    ~CodeSegmentCPUMonitor() {
#ifdef _WIN32
        FILETIME endTime;
        GetSystemTimeAsFileTime(&endTime);
        ULARGE_INTEGER endTime64;
        endTime64.LowPart = endTime.dwLowDateTime;
        endTime64.HighPart = endTime.dwHighDateTime;
        double elapsedTime = static_cast<double>(endTime64.QuadPart - startTime.QuadPart) / frequency.QuadPart;
#else
        struct timespec endTime;
        clock_gettime(CLOCK_MONOTONIC, &endTime);
        double elapsedTime = static_cast<double>(endTime.tv_sec - startTime.tv_sec) +
                             static_cast<double>(endTime.tv_nsec - startTime.tv_nsec) / 1e9;
#endif
 
        double averageCPUUsage = (totalCycles / elapsedTime) * 100.0 / processorSpeed;
        logger.log("Total Average CPU Usage: " + std::to_string(averageCPUUsage) + "%");
    }
 
    void enterCodeSegment() {
#ifdef _WIN32
        GetSystemTimeAsFileTime(&codeSegmentStartTime);
#else
        clock_gettime(CLOCK_MONOTONIC, &codeSegmentStartTime);
#endif
    }
 
    void exitCodeSegment() {
#ifdef _WIN32
        FILETIME codeSegmentEndTime;
        GetSystemTimeAsFileTime(&codeSegmentEndTime);
        ULARGE_INTEGER codeSegmentEndTime64;
        codeSegmentEndTime64.LowPart = codeSegmentEndTime.dwLowDateTime;
        codeSegmentEndTime64.HighPart = codeSegmentEndTime.dwHighDateTime;
        double codeSegmentElapsedTime = static_cast<double>(codeSegmentEndTime64.QuadPart - codeSegmentStartTime.QuadPart) / frequency.QuadPart;
#else
        struct timespec codeSegmentEndTime;
        clock_gettime(CLOCK_MONOTONIC, &codeSegmentEndTime);
        double codeSegmentElapsedTime = static_cast<double>(codeSegmentEndTime.tv_sec - codeSegmentStartTime.tv_sec) +
                                        static_cast<double>(codeSegmentEndTime.tv_nsec - codeSegmentStartTime.tv_nsec) / 1e9;
#endif
 
        totalCycles += codeSegmentElapsedTime;
    }
 
private:
    CPUMonitorOutputInterface& logger;
 
#ifdef _WIN32
    LARGE_INTEGER frequency;
    LARGE_INTEGER startTime;
    FILETIME codeSegmentStartTime;
#else
    struct timespec startTime;
    struct timespec codeSegmentStartTime;
#endif
 
    double totalCycles = 0;
    const double processorSpeed = 2.5e9;
};
 
int main() {
    // Example: Measure CPU usage for code segment 1 with ConsoleLogger
    {
        ConsoleLogger consoleLogger;
        CodeSegmentCPUMonitor monitor(consoleLogger);
        monitor.enterCodeSegment();
 
        // Your code segment 1 here
 
        monitor.exitCodeSegment();
    }
 
    // Example: Measure CPU usage for code segment 2 with ConsoleLogger
    {
        ConsoleLogger consoleLogger;
        CodeSegmentCPUMonitor monitor(consoleLogger);
        monitor.enterCodeSegment();
 
        // Your code segment 2 here
 
        monitor.exitCodeSegment();
    }
 
    // ... Add more code segments as needed ...
 
    return 0;
}

到此這篇關(guān)于C++實(shí)現(xiàn)獲取指定代碼段的cpu占用的文章就介紹到這了,更多相關(guān)C++獲取cpu占用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談MFC 改變控件大小和位置

    淺談MFC 改變控件大小和位置

    在用VC開(kāi)發(fā)應(yīng)用程序時(shí),經(jīng)常會(huì)要做一些可以改變大小的對(duì)話(huà)框,而這個(gè)時(shí)候就要求對(duì)話(huà)框上的控件會(huì)隨著對(duì)話(huà)框大小的改變而改變自己的位置和大小。下面我們就來(lái)探討下在MFC中如何改變控件大小和位置
    2015-06-06
  • C++Smart Pointer 智能指針詳解

    C++Smart Pointer 智能指針詳解

    這篇文章主要為大家詳細(xì)介紹了C++Smart Pointer 智能指針,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 基于Qt實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器

    基于Qt實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器

    這篇文章主要介紹了如何使用Qt框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器應(yīng)用,我們將使用C++編程語(yǔ)言和Qt的圖形用戶(hù)界面庫(kù)來(lái)開(kāi)發(fā)這個(gè)應(yīng)用,并展示如何實(shí)現(xiàn)基本的算術(shù)操作,希望對(duì)大家有所幫助
    2023-11-11
  • C++實(shí)現(xiàn)Huffman的編解碼

    C++實(shí)現(xiàn)Huffman的編解碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)Huffman的編解碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 文件編譯時(shí)出現(xiàn)multiple definition of ''xxxxxx''的具體解決方法

    文件編譯時(shí)出現(xiàn)multiple definition of ''xxxxxx''的具體解決方法

    以下是對(duì)文件編譯時(shí)出現(xiàn)multiple definition of 'xxxxxx'的解決方法進(jìn)行了詳細(xì)的分析介紹,如也遇到此問(wèn)題的朋友們可以過(guò)來(lái)參考下
    2013-07-07
  • C語(yǔ)言 文件的打開(kāi)與關(guān)閉詳解及示例代碼

    C語(yǔ)言 文件的打開(kāi)與關(guān)閉詳解及示例代碼

    本文主要介紹C語(yǔ)言 文件的基礎(chǔ)知識(shí),這里整理了相關(guān)資料及示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • 關(guān)于在C程序中處理UTF-8文本的方法詳解

    關(guān)于在C程序中處理UTF-8文本的方法詳解

    這篇文章主要給大家介紹了關(guān)于在C程序中處理UTF-8文本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-11-11
  • C++滑動(dòng)窗口詳解(優(yōu)選算法)

    C++滑動(dòng)窗口詳解(優(yōu)選算法)

    這篇文章主要介紹了C++滑動(dòng)窗口詳解(優(yōu)選算法),本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-06-06
  • C語(yǔ)言 數(shù)據(jù)類(lèi)型詳細(xì)介紹

    C語(yǔ)言 數(shù)據(jù)類(lèi)型詳細(xì)介紹

    本文主要講解C語(yǔ)言 數(shù)據(jù)類(lèi)型,這里整理了詳細(xì)的數(shù)據(jù)類(lèi)型的資料,希望能幫助剛剛開(kāi)始學(xué)習(xí)C語(yǔ)言的同學(xué)
    2016-08-08
  • c語(yǔ)言中if語(yǔ)句是怎么變成匯編代碼的詳解

    c語(yǔ)言中if語(yǔ)句是怎么變成匯編代碼的詳解

    if語(yǔ)句是指編程語(yǔ)言,包括c語(yǔ)言、C#、VB、java、匯編語(yǔ)言等,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言中if語(yǔ)句是怎么變成匯編代碼的相關(guān)資料,需要的朋友可以參考下
    2021-11-11

最新評(píng)論

常州市| 日照市| 宜章县| 合川市| 康平县| 武穴市| 肥乡县| 涟水县| 德钦县| 台湾省| 雅江县| 江油市| 犍为县| 织金县| 昆明市| 巧家县| 灵丘县| 伊吾县| 通化县| 青铜峡市| 隆尧县| 崇文区| 千阳县| 三台县| 灵川县| 石棉县| 延津县| 新密市| 宝清县| 锡林郭勒盟| 田东县| 奉新县| 民勤县| 安阳县| 杭州市| 揭东县| 东海县| 沙坪坝区| 常州市| 巫山县| 乐亭县|