【问题标题】:Use clock() to count program execution time使用clock()计算程序执行时间
【发布时间】:2011-11-20 14:33:06
【问题描述】:

我正在使用这样的东西来计算我的程序从开始到结束需要多长时间:

int main(){
    clock_t startClock = clock();
    .... // many codes
    clock_t endClock = clock();
    printf("%ld", (endClock - startClock) / CLOCKS_PER_SEC);
}

我的问题是,由于有多个进程同时运行,假设我的进程在 idle 的 x 时间段内,在这段时间内我的程序中的时钟会滴答作响吗?

所以基本上我担心的是,假设经过了 1000 个时钟周期,但我的进程只使用其中的 500 个,我会从 (endClock - startClock) 获得 500 个还是 1000 个?

谢谢。

【问题讨论】:

  • 您是要测量 CPU 时间还是挂钟时间?
  • 我想比较不同实现的性能,所以我认为CPU时间会更合适。有什么建议吗?
  • 您使用的是 Linux 还是 Windows?还是别的什么?
  • 由于您使用的是 Linux,clock() 将为您提供 CPU 时间。如果您的应用程序只是单线程的,这是衡量性能的好方法(前提是您没有其他可能通过缓存或超线程干扰的进程......)。但是,如果它是多线程的,则使用挂钟会产生更有意义的性能结果。
  • 我实际上是在尝试比较不同实现之间的性能(使用 16/32/64/etc 线程)。我可以在创建线程之前做startClock=clock(),在加入之后做endClock=clock()吗?如果挂钟是多线程代码,为什么它会提供更有意义的性能?谢谢。

标签: c performance time


【解决方案1】:

这取决于操作系统。在 Windows 上,clock() 测量挂墙时间。在 Linux/Posix 上,它测量所有线程的总 CPU 时间。

如果你想在 Linux 上使用 wall-time,你应该使用gettimeofday()

如果你想在 Windows 上使用 CPU 时间,你应该使用GetProcessTimes()

编辑:

因此,如果您使用的是 Windows,clock()测量空闲时间。

在 Linux 上,clock() 不会测量空闲时间。

【讨论】:

  • 无论哪种情况,我都不会使用它;它的分辨率很差。看我的回答。
  • 没错,但是看看 cmets,程序是多线程的,所以我不确定 OP 是否想使用 CPU-time 来衡量性能。
【解决方案2】:

clock 在 POSIX 上测量 CPU 时间,但它通常具有极差的分辨率。相反,现代程序应该使用clock_gettimeCLOCK_PROCESS_CPUTIME_ID 时钟ID。这将放弃纳秒级分辨率的结果,而且通常真的差不多。

【讨论】:

  • YMMV。刚刚在我工作使用的AIX系统上发现,clock_gettime的分辨率比clock还要差。 clock 似乎有大约 3 毫秒的分辨率,而clock_getres 报告了 10 毫秒的分辨率。
【解决方案3】:

根据手册页上的定义(在 Linux 中),

clock() 函数返回使用的处理器时间的近似值 通过程序。

它会尽可能准确,但正如您所说,有些时间(例如进程切换)很难解释到进程,因此数字将尽可能准确,但并不完美。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2022-01-21
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多