首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Linux C++ 函數調用計時器:微秒級性能分析工具

     編輯:關於C++

設計目標

以 RAII 方式自動記錄函數進入/離開時間,輸出耗時(秒),支援嵌套調用,零侵入業務代碼。

實現:FunTimer 類

// FunTimer.h
#ifndef FUNTIMER_H
#define FUNTIMER_H
#include <string>
#include <sys/time.h>
#include <iostream>

class FunTimer {
    std::string name_;
    timeval start_, end_;
public:
    explicit FunTimer(const std::string& name = "") : name_(name) {
        gettimeofday(&start_, nullptr);
    }
    ~FunTimer() {
        gettimeofday(&end_, nullptr);
        double sec = (end_.tv_sec - start_.tv_sec) +
                     (end_.tv_usec - start_.tv_usec) / 1e6;
        if (!name_.empty())
            std::cout << name_ << ": " << sec << " s\n";
        else
            std::cout << "Elapsed: " << sec << " s\n";
    }
};
#endif

使用示例

// FunTimerMain.cpp
#include "FunTimer.h"
#include <iostream>

void testPrintFun() {
    FunTimer timer(__FUNCTION__);  // 自動記錄函數名
    for (int i = 0; i < 1000; ++i) std::cout << ' ';
}

void testPrintFun2() {
    FunTimer timer(__FUNCTION__);
    for (int i = 0; i < 2000; ++i) std::cout << ' ';
}

int main() {
    FunTimer mainTimer("main");
    testPrintFun();
    testPrintFun2();
    return 0;
}

輸出示例

testPrintFun: 0.001234 s
testPrintFun2: 0.002456 s
main: 0.003690 s

替代方案:clock() 版

若不需牆鐘時間,可用 clock_t 統計 CPU 時間:

class FunTimer {
    std::string name_;
    clock_t start_, end_;
public:
    explicit FunTimer(const std::string& name) : name_(name), start_(clock()) {}
    ~FunTimer() {
        end_ = clock();
        std::cout << name_ << ": " << double(end_ - start_) / CLOCKS_PER_SEC << " s\n";
    }
};

編譯與運行

g++ -std=c++11 -O2 FunTimer.cpp FunTimerMain.cpp -o timer_demo
./timer_demo

總結

FunTimer 利用建構/析構函數自動計時,配合 __FUNCTION__ 宏零成本獲取函數名,適合快速定位效能熱點。gettimeofday 提供微秒精度牆鐘時間,clock() 提供 CPU 時間,按需選擇。代碼極簡,易於整合到現有專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved