C++中的高分辨率定时器
high resolution timer in C++
我正在阅读关于高分辨率计时器的文章,以检查给定函数所用的时间。我发现以下代码
double apHiResElapsedTime::sec () const
{
struct timeval t;
gettimeofday (&t, 0);
double now = 1.e-6 * t.tv_usec + t.tv_sec;
return (now - starting_);
}
我的问题是,1.e-6的价值在这里意味着什么?以及作者为什么要做1.e-6*t.tv_usec+t.tv_sec.
请在此处请求您的帮助。
谢谢你的时间和帮助。
1.e-6
是科学记数法中的一个数字,等于10 ^ -6
或0.000001
,类型为double
。你可以把它读成"十到负六"。
由于gettimeofday()
将时间返回为两个独立的整数(秒和微秒),因此通过将整数微秒值除以一百万,微秒部分将转换为表示秒的双值。然后,将整秒(tv_sec
)添加到结果中。
例如,假设gettimeofday()
返回6秒5微秒,则此代码将执行5 * 0.000001 + 6
并产生6.000005秒。
顺便说一句,gettimeofday()
并不是真正的高分辨率时钟(当然与计时器无关),它也被弃用。您应该考虑使用clock_gettime()
。它支持各种类型的"时钟",并具有纳秒精度。对于性能测量,人们倾向于使用CLOCK_MONOTONIC_RAW
标志来访问未经NTP调整的挂钟。请注意,它可能不适用于所有系统。例如,在OS X上,必须使用mach_absolute_time()
。
我还建议避免使用FPU(浮动,双重类型)。只需使用两个整数即可。例如,如果使用clock_gettime()
,则可以计算不带双精度的差值。下面是C99中一个非常简单的例子(我相信你可以很容易地将其转换为C++):
//
// C99 program that demonstrates the usage of `clock_gettime()`
// and shows how to calculate a difference between two timestamps
// in nanoseconds.
//
// $ gcc -Wall -pedantic -std=gnu99 ./test.c -o ./test -lrt
//
#include <time.h>
#include <inttypes.h>
#include <stdio.h>
static int64_t
get_elapsed_time(const struct timespec * restrict start_time,
const struct timespec * restrict end_time)
{
int64_t sec = end_time->tv_sec - start_time->tv_sec;
int64_t nsec;
if (end_time->tv_nsec >= start_time->tv_nsec) {
nsec = end_time->tv_nsec - start_time->tv_nsec;
} else {
nsec = 1000000000 - (start_time->tv_nsec - end_time->tv_nsec);
sec -= 1;
}
return sec > 0 ? sec * 1000000000 : 0 + nsec > 0 ? nsec : 0;
}
int main()
{
struct timespec start_time;
struct timespec end_time;
clock_gettime(CLOCK_MONOTONIC_RAW, &start_time);
puts("Hello!n");
clock_gettime(CLOCK_MONOTONIC_RAW, &end_time);
printf("Oh, look! It took me %" PRId64 " nanoseconds to say hi!n",
get_elapsed_time(&start_time, &end_time));
}
希望能有所帮助。祝你好运
相关文章:
- Ardunio UNO解决了多个重叠的定时器循环
- 在Windows(C++)中使用USB相机拍摄高分辨率照片
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 如何在C++中为高分辨率时钟声明变量?
- 没有信号处理程序的POSIX定时器的目的是什么?
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- 在没有NtSetTimerResolution的Windows上提高计时器分辨率(高分辨率)
- 如何在Qt中修改QWebsocket定时器
- 实现高分辨率计时器的最佳方法
- DX9 桌面窗口管理器高 CPU
- 用户空间(Linux)中是否有高分辨率时钟(我们)?
- C++Windows中的高分辨率定时器库
- 跨平台C++高精度事件定时器实现
- C++中的高分辨率定时器
- 高分辨率计时器与低分辨率计时器
- 为什么我应该使用SetTimer功能,而不是多媒体定时器服务的应用程序不需要高分辨率定时
- Windows(也包括OS X、Linux)上Qt中的高分辨率定期计时器
- 如何用c++在windows上实现长期高分辨率定时
- 正在寻找高分辨率计时器