以 RAII 方式自動記錄函數進入/離開時間,輸出耗時(秒),支援嵌套調用,零侵入業務代碼。
// 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 時間,按需選擇。代碼極簡,易於整合到現有專案。