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