实例讲解html5制作一个网站,wordpress下载插件美化,万网建站,网站建立的一、前言
计时器的开发通常涉及到计算时间间隔的方法和计算时间的方式。一般计时器的开发步骤#xff1a; 获取起始时间点#xff1a;在开始计时时#xff0c;记录当前的时间戳作为起始时间点。 获取结束时间点#xff1a;在结束计时时#xff0c;记录当前的时间戳作为结…一、前言
计时器的开发通常涉及到计算时间间隔的方法和计算时间的方式。一般计时器的开发步骤 获取起始时间点在开始计时时记录当前的时间戳作为起始时间点。 获取结束时间点在结束计时时记录当前的时间戳作为结束时间点。 计算时间间隔通过起始时间点和结束时间点的差值计算出经过的时间间隔。 显示计时结果将计算得到的时间间隔转换成合适的时间单位如毫秒、秒等并展示给用户。
二、计时器的适配场景
下面是对比各种方法实现计时器功能的优劣势、适用场景、精度、易用性和平台兼容性的表格
方法优势劣势适用场景精度易用性平台兼容性chrono高精度、跨平台需要 C11 及以上标准支持跨平台应用、需要高精度计时的场景高中良好标准库函数简单易用精度可能不够高简单计时需求、不需要太高精度的场景低 - 中高良好系统特定函数高精度、系统调用简单可移植性差特定平台上需要更高精度的计时需求高中差第三方库功能丰富、可扩展性强引入外部依赖复杂计时需求、需要定制化计时功能的场景高高良好硬件计时器高精度、硬件支持硬件依赖性强对计时精度要求极高的场景非常高中依赖硬件
三、基于标准库实现
3.1 使用clock函数
使用 clock() 函数实现计时器功能。
记录开始时间在需要开始计时的地方调用 clock() 函数将其返回值保存为开始时间。记录结束时间在需要结束计时的地方再次调用 clock() 函数将其返回值保存为结束时间。计算时间间隔将结束时间减去开始时间然后除以 CLOCKS_PER_SEC 来获取经过的时间以秒为单位。
#include iostream
#include ctimeint main() {clock_t start, end;double cpu_time_used;start clock(); // 记录开始时间// 进行需要计时的操作for (int i 0; i 1000000; i) {// do something}end clock(); // 记录结束时间cpu_time_used ((double) (end - start)) / CLOCKS_PER_SEC; // 计算时间间隔std::cout CPU time used: cpu_time_used seconds std::endl;return 0;
}在这个示例中首先记录了开始时间和结束时间然后计算了经过的时间间隔。 请注意由于 clock() 函数返回的是 CPU 时钟周期数所以需要将其转换为秒数才能得到实际的时间间隔。
3.2 使用time函数
使用 time() 函数实现计时器相对简单但其精度可能不足以满足高精度计时的需求。
#include iostream
#include ctimeint main() {time_t start, end;double time_used;start time(NULL); // 记录开始时间// 进行需要计时的操作for (int i 0; i 1000000; i) {// do something}end time(NULL); // 记录结束时间time_used difftime(end, start); // 计算时间间隔std::cout Time used: time_used seconds std::endl;return 0;
}在这个示例中我们使用 time() 函数获取当前时间的秒数作为开始时间和结束时间并通过 difftime() 函数计算时间间隔。 请注意time() 函数返回的时间精度通常是秒级别因此不适合需要高精度计时的场景。如果需要更高精度的计时功能建议使用其他方法如 chrono 头文件中的函数。
四、基于chrono库实现
使用chrono头文件中的功能来实现计时功能
#include iostream
#include chronoclass Timer {
public:void start() {startTime std::chrono::high_resolution_clock::now();}void stop() {endTime std::chrono::high_resolution_clock::now();}void displayDuration(const std::string message) {auto duration std::chrono::duration_caststd::chrono::milliseconds(endTime - startTime);std::cout message : duration.count() ms std::endl;}
private:std::chrono::time_pointstd::chrono::high_resolution_clock startTime, endTime;
};
int main() {Timer timer;timer.start();// 模拟一些操作for (int i 0; i 1000000; i) {// do something}timer.stop();timer.displayDuration(Elapsed time);return 0;
}在这个示例中Timer类封装了计时器的功能。start()方法开始计时stop()方法停止计时displayDuration()方法用于显示经过的时间。 在main()函数中创建一个Timer对象调用start()开始计时在模拟的操作后调用stop()停止计时并调用displayDuration()方法显示经过的时间。
五、基于系统特定函数
5.1 QueryPerformanceCounter
可以使用Windows系统提供的QueryPerformanceCounter()函数来实现简单计时器功能
#include iostream
#include Windows.hclass Timer {
public:void start() {QueryPerformanceFrequency(frequency);QueryPerformanceCounter(startCounter);}void stop() {QueryPerformanceCounter(endCounter);}void displayDuration(const std::string message) {LARGE_INTEGER elapsedTime;elapsedTime.QuadPart endCounter.QuadPart - startCounter.QuadPart;double duration static_castdouble(elapsedTime.QuadPart) / frequency.QuadPart;std::cout message : duration seconds std::endl;}private:LARGE_INTEGER frequency;LARGE_INTEGER startCounter, endCounter;
};int main() {Timer timer;timer.start();// 模拟一些操作for (int i 0; i 1000000; i) {// do something}timer.stop();timer.displayDuration(Elapsed time);return 0;
}在这个示例中Timer类使用QueryPerformanceCounter()函数来获取高精度的计时。start()方法开始计时stop()方法停止计时displayDuration()方法用于显示经过的时间。 在main()函数中创建一个Timer对象调用start()开始计时在模拟的操作后调用stop()停止计时并调用displayDuration()方法显示经过的时间。
5.2 GetTickCount64
GetTickCount64函数是Windows API中用于获取系统启动后经过的毫秒数的函数它可以用来实现简单的计时器功能。
#include iostream
#include Windows.hclass Timer {
public:void start() {startTime GetTickCount64();}void stop() {endTime GetTickCount64();}void displayDuration(const std::string message) {DWORD duration endTime - startTime;std::cout message : duration ms std::endl;}private:ULONGLONG startTime, endTime;
};int main() {Timer timer;timer.start();// 模拟一些操作for (int i 0; i 1000000; i) {// do something}timer.stop();timer.displayDuration(Elapsed time);return 0;
}在这个示例中Timer类使用GetTickCount64函数来获取系统启动后的毫秒数。start()方法开始计时stop()方法停止计时displayDuration()方法用于显示经过的时间。
在main()函数中创建一个Timer对象调用start()开始计时在模拟的操作后调用stop()停止计时并调用displayDuration()方法显示经过的时间。
六、基于第三方库实现
使用C中的高精度计时器库ChronoLib来实现计时器功能
#include iostream
#include ChronoLib.hint main() {Chrono::high_resolution_timer timer;double elapsed_time 0.0;// 计时开始timer.start();// 执行需要计时的操作// ...// 计时结束elapsed_time timer.elapsed();// 输出计时结果std::cout Elapsed Time: elapsed_time seconds std::endl;return 0;
}在这个示例中我们使用ChronoLib库中的high_resolution_timer类来实现高精度计时器功能。我们创建了一个计时器对象timer和一个变量elapsed_time来保存计时结果。在需要计时的操作执行前我们通过start函数开始计时。在需要计时的操作执行完成后我们使用elapsed函数来获取计时结果并将结果保存到elapsed_time变量中。最后我们输出计时结果。
七、基于硬件计时器模块实现
硬件计时器通常指的是计算机或嵌入式系统中的专用计时器硬件模块这些模块通常由硬件设计师设计并集成到处理器或主板中。硬件计时器具有高精度、稳定性和可靠性的特点通常用于需要精确时间测量和控制的应用场景。
八、总结
每种方法都有其独特的优势和劣势具体选择取决于项目需求、平台要求和精度要求。