如何在C中找到我的程序部分的执行时间?

时间:2008-10-06 07:04:45

标签: c timing

我正在尝试找到一种方法来获取C中一段代码的执行时间。我已经从time.h尝试了time()和clock(),但似乎time()返回秒和时钟()似乎给我几毫秒(或几厘秒?)我想要更精确的东西。有没有办法以至少微秒的精度抓住时间?

这只需要能够在Linux上编译。

11 个答案:

答案 0 :(得分:15)

您提到clock()time() - 您在寻找gettimeofday()吗? 这将填入struct timeval,其中包含秒和微秒。

当然,实际分辨率取决于硬件。

答案 1 :(得分:12)

对于它的价值,这里只是一些宏:

#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

答案 2 :(得分:11)

您需要profiler个应用程序。

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

答案 3 :(得分:3)

答案 4 :(得分:2)

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

它仅适用于x86。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

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

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

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

答案 9 :(得分:0)

这取决于条件.Profiler对于一般的全局视图很好但是如果你真的需要一个准确的视图,我的建议是KISS。只需在循环中运行代码,即需要一分钟左右才能完成。然后根据总运行时间和执行的迭代计算一个简单的平均值。

这种方法允许您:

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

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

答案 10 :(得分:0)

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