很方便的计时类 GoodClock 基于 std::chrono

6 篇文章 2 订阅
文章介绍了一个名为GoodClock的类,用于封装代码计时功能,支持多种时间单位。该类利用std::chrono库进行高精度计时,并通过互斥锁确保在多线程环境下的输出安全。示例展示了如何对全局函数、成员函数和局部函数进行计时测试。
摘要由CSDN通过智能技术生成

在一段需要计时的代码前后加上计时代码,总是让人感觉多余、不适,如果能把要执行的代码放(编译)到一个函数里就好了,这样在感官上就很清爽、整齐。所以设计了一个函数,用类浅浅的封装了一下,封装它主要是为了给输出上锁,这样在多线程环境下也能正确输出。

计时类的代码 GoodClock.h

#pragma once
#include <iostream>
#include <chrono>
using namespace std::chrono;

class GoodClock
{
private:
	std::mutex printlock;
public:
	template<typename Type, typename StringType, typename Fn = void(void), typename ...Args>
	long long RunPrint(StringType funcname,Fn func, Args &&... args) {
		char msg[20];
		if (std::is_same_v<Type, microseconds>) {
			char temp[20] = "microseconds\0";
			memmove(msg,temp,sizeof(temp));
		}
		if (std::is_same_v<Type, nanoseconds>) {
			char temp[20] = "nanoseconds\0";
			memmove(msg, temp, sizeof(temp));
		}
		if (std::is_same_v<Type, milliseconds>) {
			char temp[20] = "milliseconds\0";
			memmove(msg, temp, sizeof(temp));
		}
		if (std::is_same_v<Type, seconds>) {
			char temp[20] = "seconds\0";
			memmove(msg, temp, sizeof(temp));
		}
		time_point<high_resolution_clock>_start = high_resolution_clock::now();
		auto localfunc = std::bind(std::forward<Fn>(func), std::forward<Args>(args)...);
		localfunc();
		long long time = duration_cast<Type>(high_resolution_clock::now() - _start).count();
		{
			std::lock_guard<std::mutex> lck(printlock);
			std::cout << funcname << " cost " << time << " " << msg << std::endl;
		}
		return time;
	}
};

计时类的使用 test.cpp,测试了全局函数、成员函数、局部函数

#include "GoodClock.h"
void test_clock_func1(int delay) {
	Sleep(delay);
}

class test_clock_class {
	int res = 0;
public:
	void test_clock_func2(int loopTimes) {
		for (int i = 0; i < loopTimes; i++) {
			res *= (res + i);
		}
	}
};

int main() {
	GoodClock clock;
	test_clock_class foo;
	auto test_clock_func3 = []() {Sleep(2); };

	clock.RunPrint<std::chrono::microseconds>("延时 1", test_clock_func1,2);	
	clock.RunPrint<std::chrono::milliseconds>("延时 2", []() {Sleep(2); });
	clock.RunPrint<std::chrono::milliseconds>("延时 3", test_clock_func3);
	clock.RunPrint<std::chrono::nanoseconds>("计算", &test_clock_class::test_clock_func2, &foo, 1000);
    return 0;
}

测试时发现 Sleep(2) 实测延时是 3ms 左右,可是我清除的记得以前在 windows 上 Sleep(n) 最小也是 10ms 有没有了解的大佬烦请告知一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值