经过几方探索,写出来一个可以支持Linux和window的统计耗时的工具。
【anjos-keba.h】
// anjos-keba.h
#ifndef _ANJOS_KEBA_
#define _ANJOS_KEBA_
/**
* C++时间统计 https://www.cnblogs.com/didiaodidiao/p/9194702.html
*/
namespace anjos {
class AnjosLog {
private:
#ifdef _WIN32
clock_t origin, start, end, middle;
#else
struct timespec origin, start, end, middle;
#endif // !_WIN32
public:
long speed;
bool is_print_log;
AnjosLog() {}
AnjosLog(bool is_print_log);
void begin();
long time(const char* mes);
void begin2Series(const char* series_name);
long stop2Series();
long stop();
};
}
#endif
【anjos-keba.cpp】
#include "anjos-keba.h"
anjos::AnjosLog::AnjosLog(bool is_print_log) {
this->is_print_log = is_print_log;
this->speed = 0;
}
void anjos::AnjosLog::begin() {
if (this->is_print_log) printf("begin=%s\n", now2str().c_str());
#ifdef _WIN32
start = clock();
origin = clock();
#else
clock_gettime(0, &start);
clock_gettime(0, &origin);
#endif
}
long anjos::AnjosLog::time(const char* mes) {
#ifdef _WIN32
end = clock();
speed = (long)(end - start) / (CLOCKS_PER_SEC * 1.0) * 1000;
start = clock(); // 重新开始计时
#else
clock_gettime(0, &end);
speed = (long)(end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
clock_gettime(0, &start);// 重新开始计时
#endif // !_WIN32
if (this->is_print_log) printf("series=%s %s %ld ms\n", now2str().c_str(), mes, speed);
return speed;
}
void anjos::AnjosLog::begin2Series(const char* series_name) {
#ifdef _WIN32
middle = clock();
start = clock();//系列中可以配置time
#else
clock_gettime(0, &middle);
clock_gettime(0, &start);
#endif // !_WIN32
if (this->is_print_log) printf("begin series=%s %s\n", now2str().c_str(), series_name);
}
long anjos::AnjosLog::stop2Series() {
#ifdef _WIN32
end = clock();
speed = (long)(end - middle) / (CLOCKS_PER_SEC * 1.0) * 1000;
start = clock();
#else
clock_gettime(0, &end);
speed = (long)(end.tv_sec - middle.tv_sec) * 1000 + (end.tv_nsec - middle.tv_nsec) / 1000000;
clock_gettime(0, &start);
#endif // !_WIN32
if (this->is_print_log) printf("stop series=%ld ms\n", speed);
return speed;
}
long anjos::AnjosLog::stop() {
#ifdef _WIN32
end = clock();
speed = (long)(end - origin) / (CLOCKS_PER_SEC * 1.0) * 1000;
#else
clock_gettime(0, &end);
speed = (long)(end.tv_sec - origin.tv_sec) * 1000 + (end.tv_nsec - origin.tv_nsec) / 1000000;
#endif // !_WIN32
if (this->is_print_log) printf("stop=%s %ld ms\r\n", now2str().c_str(), speed); //printf只能打印char,cout只能打印string
return speed;
}
测试方法如下:
int main(void){
anjos::AnjosLog log(true);
log.begin();
log.time("init opt");
log.time("load pipe");
log.begin2Series("series1");
log.stop2Series();
log.begin2Series("series2");
log.stop2Series();
log.stop();
}