C中函数的毫秒精度计时 - 跨平台
Posted
技术标签:
【中文标题】C中函数的毫秒精度计时 - 跨平台【英文标题】:millisecond precision timing of functions in C - crossplatform 【发布时间】:2013-07-14 12:03:42 【问题描述】:有没有办法使用跨平台方法在 C 语言中获得毫秒级的精度和准确度(至少在几毫秒内)?
在 POSIX 系统上,我可以使用 sys/time.h,但这不是跨平台的。
stdlib time() 函数只提供二级精度
【问题讨论】:
您可以随时循环检查当前时间......您能否提供更多信息,包括您尝试的原因和尝试的内容? 你能不能在一个循环中运行子程序 1000 次,以秒为单位测量时间,然后除以 1000。顺便说一句,在处理器中,毫秒是 long 时间. 这是用于可能在 ~50 毫秒到 10 秒范围内运行的计时算法 【参考方案1】:我还没有找到用 C 语言测量时间的跨平台解决方案。但是,我所做的是对 Unix 和 Windows 使用几乎相同的功能。我创建了这个gist,因为我每次都必须重新查找它。简而言之:
Unix
#include <time.h>
long diff_micro(struct timespec *start, struct timespec *end)
/* us */
return ((end->tv_sec * (1000000)) + (end->tv_nsec / 1000)) -
((start->tv_sec * 1000000) + (start->tv_nsec / 1000));
long diff_milli(struct timespec *start, struct timespec *end)
/* ms */
return ((end->tv_sec * 1000) + (end->tv_nsec / 1000000)) -
((start->tv_sec * 1000) + (start->tv_nsec / 1000000));
int main(int argc, char **argv)
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
// Activity to be timed
sleep(1000);
clock_gettime(CLOCK_MONOTONIC, &end);
printf("%ld us\n", diff_micro(&start, &end));
printf("%ld ms\n", diff_milli(&start, &end));
return 0;
source for Unix solution
Win32
#include <Windows.h>
long diff_micro(LARGE_INTEGER *start, LARGE_INTEGER *end)
LARGE_INTEGER Frequency, elapsed;
QueryPerformanceFrequency(&Frequency);
elapsed.QuadPart = end->QuadPart - start->QuadPart;
elapsed.QuadPart *= 1000000;
elapsed.QuadPart /= Frequency.QuadPart;
return elapsed.QuadPart;
long diff_milli(LARGE_INTEGER *start, LARGE_INTEGER *end)
LARGE_INTEGER Frequency, elapsed;
QueryPerformanceFrequency(&Frequency);
elapsed.QuadPart = end->QuadPart - start->QuadPart;
elapsed.QuadPart *= 1000;
elapsed.QuadPart /= Frequency.QuadPart;
return elapsed.QuadPart;
int main(int argc, char **argv)
LARGE_INTEGER StartingTime, EndingTime;
QueryPerformanceCounter(&StartingTime);
// Activity to be timed
Sleep(1000);
QueryPerformanceCounter(&EndingTime);
printf("%ld us\n", diff_micro(&StartingTime, &EndingTime));
printf("%ld ms\n", diff_milli(&StartingTime, &EndingTime));
return 0;
source used for Win32 solution
【讨论】:
【参考方案2】:你可以试试这样的:-
#include <time.h>
clock_t uptime = clock() / (CLOCKS_PER_SEC / 1000);
看到这个Link
【讨论】:
clock
提供 CPU 时间,而不是实时。它在阻塞时停止,如果是多线程的,它会更快。【参考方案3】:
最好的方法是使用std::chrono
#include <chrono>
...
auto begin = std::chrono::high_resolution_clock::now();
...
auto end = std::chrono::high_resolution_clock::now();
elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count();
【讨论】:
以上是关于C中函数的毫秒精度计时 - 跨平台的主要内容,如果未能解决你的问题,请参考以下文章