我正在尝试找到一种方法来获取 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;
}

来自 http://ctips.pbwiki.com/Timer

您需要分析器应用程序。

搜索SO和搜索引擎的关键字:linux profiling

尝试“bench.h”;它可以让你放一个START_TIMER;和STOP_TIMER(“名称”);进入你的代码,允许你随意地对任何代码段进行基准测试(注意:只推荐用于短段,而不是花费几十毫秒或更长时间)。它精确到时钟周期,但在极少数情况下它可以改变编码之间的代码,在这种情况下你最好使用分析器(虽然分析器通常更费力地用于特定的代码段)。

它仅适用于x86。

您可能想要谷歌获取检测工具。

您将找不到可以超越平台时钟分辨率的库调用。要么使用分析器(man gprof)作为另一张建议的海报,要么 - 快速&amp; dirty - 在代码的违规部分周围放置一个循环来执行它多次,并使用clock()。

gettimeofday()为您提供微秒的分辨率,而 < code> 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。只需循环运行代码,只需一分钟左右即可完成。然后根据总运行时间和执行的迭代计算简单平均值。

这种方法允许您:

  1. 使用低分辨率计时器获得准确的结果。

  2. 不会遇到仪器干扰靠近处理器的高速缓存(l2​​、l1、分支等)的问题。然而,在紧密循环中运行相同的代码也可以提供可能无法反映现实世界条件的乐观结果。

不知道您正在使用哪种环境/操作系统,但如果另一个线程,任务或进程在中间抢占您的定时代码,则您的时间可能不准确。我建议探索互斥锁或信号量等机制,以防止其他线程预先处理您的进程。

如果您在x86或x64上进行开发,为什么不使用时间戳计数器: RDTSC

因为RDTSC是一个原子函数,所以Ansi C的功能比time()或clock()更可靠。为此目的使用C函数可能会引入问题,因为您无法保证它们正在执行的线程不会被切换,因此它们返回的值将无法准确描述您尝试测量的实际执行时间

使用RDTSC,您可以更好地衡量这一点。您需要将滴答计数转换回人类可读时间H:M:S格式,这将取决于处理器的时钟频率,但谷歌周围,我相信你会找到例子。

然而,即使使用RDTSC,您将包括代码重新开始执行的时间,同时比使用time()/ clock()更好的解决方案,如果您需要精确测量,则必须转向将使用的分析器检测代码并在代码由于上下文切换或其他原因而实际执行时不予考虑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top