C++C日志帮助和统计耗时

经过几方探索,写出来一个可以支持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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值