我正在试图找到一种在C语言中获取代码执行时间的方法。我已经尝试了来自time.h的time()和clock(),但是time()返回秒数,clock()似乎给我毫秒(或百分之一秒)的精度,我需要更加精确的时间。是否有一种方法可以以至少微秒级别的精度抓取时间?
这只需要能够在Linux上编译即可。
您提到了 clock()
和 time()
- 您是在寻找 gettimeofday()
吗?
这将填充一个包含秒和微秒的 struct timeval
。
当然,实际分辨率取决于硬件。
说实话,这是一个只有几个宏的东西:
#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);
然后只需这样使用:
main() {
START;
// Do stuff you want to time
STOP;
PRINTTIME;
}
您需要一个性能分析器应用程序。
在stackoverflow和搜索引擎上搜索关键词:linux性能分析。
你可能想要谷歌一下一个 仪器化 工具。
你不会找到一个库调用来让你超越平台的时钟分辨率。可以像其他帖子建议的那样使用分析器(man gprof),或者-快速且简单-在有问题的代码部分周围放置一个循环以执行多次,并使用clock()。
gettimeofday()
提供了微秒级别的分辨率,而 clock_gettime()
则提供了纳秒级别的分辨率。
int clock_gettime(clockid_t clk_id, struct timespec *tp);
clk_id
标识要使用的时钟。如果您想要一个系统范围内对所有进程可见的时钟,请使用 CLOCK_REALTIME
。对于每个进程计时器,请使用 CLOCK_PROCESS_CPUTIME_ID
,对于线程特定计时器,请使用 CLOCK_THREAD_CPUTIME_ID
。
这取决于具体情况。性能分析器可以提供全局视图,但如果您需要准确的视图,我的建议是KISS。只需在循环中运行代码,使其需要一分钟左右才能完成。然后根据总运行时间和执行的迭代计算一个简单的平均值。
这种方法可以让您:
使用低分辨率计时器获得准确的结果。
避免仪器干扰接近处理器的高速缓存(L2、L1、分支等)问题。但是,在紧密循环中运行相同的代码也可能提供乐观的结果,这些结果可能不反映实际情况。
不知道你正在使用哪个环境/操作系统,但如果另一个线程、任务或进程在中间抢占了你的定时代码,那么你的计时可能会不准确。我建议探索诸如互斥锁或信号量等机制,以防止其他线程抢占你的进程。