C++实现获取指定代码段的cpu占用

 更新时间:2023年12月28日 10:24:52   作者:BuffaloX_X  
这篇文章主要为大家详细介绍了C++实现获取指定代码段的cpu占用的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下

windows

#include <iostream>
#include <windows.h>
#include <vector>
 
class CodeSegmentCPUMonitor {
public:
    static CodeSegmentCPUMonitor& getInstance() {
        static CodeSegmentCPUMonitor instance;
        return instance;
    }
 
    ~CodeSegmentCPUMonitor() {
        // 获取结束性能计数器值
        QueryPerformanceCounter(&endCounter);
 
        // 计算运行时间(秒)
        double elapsedTime = static_cast<double>(endCounter.QuadPart - startCounter.QuadPart) / frequency.QuadPart;
 
        // 计算 CPU 平均占用
        double averageCPUUsage = (totalCycles / elapsedTime) * 100.0 / processorSpeed;
 
        std::cout << "Total Average CPU Usage: " << averageCPUUsage << "%\n";
    }
 
    void enterCodeSegment() {
        // 进入代码段时记录开始时间
        QueryPerformanceCounter(&codeSegmentStartCounter);
    }
 
    void exitCodeSegment() {
        // 退出代码段时记录结束时间
        QueryPerformanceCounter(&codeSegmentEndCounter);
 
        // 计算代码段的 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;
 
    // 假设处理器速度为 2.5 GHz,你需要根据实际情况调整这个值
    const double processorSpeed = 2.5e9;
 
    CodeSegmentCPUMonitor() {
        // 获取性能计数器频率
        if (QueryPerformanceFrequency(&frequency)) {
            // 获取初始性能计数器值
            QueryPerformanceCounter(&startCounter);
        } else {
            std::cerr << "Failed to get performance counter frequency.\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() {
        // 获取结束时间
        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;
 
        // 计算 CPU 平均占用
        double averageCPUUsage = (totalCycles / elapsedTime) * 100.0 / processorSpeed;
 
        std::cout << "Total Average CPU Usage: " << averageCPUUsage << "%\n";
    }
 
    void enterCodeSegment() {
        // 进入代码段时记录开始时间
        clock_gettime(CLOCK_MONOTONIC, &codeSegmentStartTime);
    }
 
    void exitCodeSegment() {
        // 退出代码段时记录结束时间
        struct timespec codeSegmentEndTime;
        clock_gettime(CLOCK_MONOTONIC, &codeSegmentEndTime);
 
        // 计算代码段的 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;
 
    // 假设处理器速度为 2.5 GHz,你需要根据实际情况调整这个值
    const double processorSpeed = 2.5e9;
 
    CodeSegmentCPUMonitor() {
        // 获取初始时间
        clock_gettime(CLOCK_MONOTONIC, &startTime);
    }
 
    // 禁用拷贝构造函数和赋值运算符
    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: 实现CPUMonitorOutputInterface的一个Logger类示例
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;
}

到此这篇关于C++实现获取指定代码段的cpu占用的文章就介绍到这了,更多相关C++获取cpu占用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈MFC 改变控件大小和位置

    浅谈MFC 改变控件大小和位置

    在用VC开发应用程序时,经常会要做一些可以改变大小的对话框,而这个时候就要求对话框上的控件会随着对话框大小的改变而改变自己的位置和大小。下面我们就来探讨下在MFC中如何改变控件大小和位置
    2015-06-06
  • C++Smart Pointer 智能指针详解

    C++Smart Pointer 智能指针详解

    这篇文章主要为大家详细介绍了C++Smart Pointer 智能指针,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 基于Qt实现简单的计算器

    基于Qt实现简单的计算器

    这篇文章主要介绍了如何使用Qt框架实现一个简单的计算器应用,我们将使用C++编程语言和Qt的图形用户界面库来开发这个应用,并展示如何实现基本的算术操作,希望对大家有所帮助
    2023-11-11
  • C++实现Huffman的编解码

    C++实现Huffman的编解码

    这篇文章主要为大家详细介绍了C++实现Huffman的编解码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 文件编译时出现multiple definition of ''xxxxxx''的具体解决方法

    文件编译时出现multiple definition of ''xxxxxx''的具体解决方法

    以下是对文件编译时出现multiple definition of 'xxxxxx'的解决方法进行了详细的分析介绍,如也遇到此问题的朋友们可以过来参考下
    2013-07-07
  • C语言 文件的打开与关闭详解及示例代码

    C语言 文件的打开与关闭详解及示例代码

    本文主要介绍C语言 文件的基础知识,这里整理了相关资料及示例代码,有兴趣的小伙伴可以参考下
    2016-08-08
  • 关于在C程序中处理UTF-8文本的方法详解

    关于在C程序中处理UTF-8文本的方法详解

    这篇文章主要给大家介绍了关于在C程序中处理UTF-8文本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-11-11
  • C++滑动窗口详解(优选算法)

    C++滑动窗口详解(优选算法)

    这篇文章主要介绍了C++滑动窗口详解(优选算法),本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-06-06
  • C语言 数据类型详细介绍

    C语言 数据类型详细介绍

    本文主要讲解C语言 数据类型,这里整理了详细的数据类型的资料,希望能帮助刚刚开始学习C语言的同学
    2016-08-08
  • c语言中if语句是怎么变成汇编代码的详解

    c语言中if语句是怎么变成汇编代码的详解

    if语句是指编程语言,包括c语言、C#、VB、java、汇编语言等,下面这篇文章主要给大家介绍了关于c语言中if语句是怎么变成汇编代码的相关资料,需要的朋友可以参考下
    2021-11-11

最新评论