【问题标题】:Computing algorithm running time in C用C计算算法运行时间
【发布时间】:2011-09-16 22:23:43
【问题描述】:

我正在使用 c 中的 time.h 库来查找运行算法所需的时间。代码结构有点如下:-

#include <time.h>

int main()
{
  time_t start,end,diff;

  start = clock();
    //ALGORITHM COMPUTATIONS
  end = clock();
  diff = end - start;
  printf("%d",diff);
  return 0;
}

start 和 end 的值始终为零。是不是clock()函数不起作用?请帮忙。 提前致谢。

【问题讨论】:

  • 查看SO-link获取gettimeofday示例
  • 这是什么平台?如果是 x86 平台,您可以/应该使用 TSC。
  • 您是要查找实时时间(即,从秒表测量的秒数)还是时钟周期(多少 cpu 操作)?

标签: c clock


【解决方案1】:

并不是说它不起作用。事实上,确实如此。但这不是测量时间的正确方法,因为clock () 函数返回程序使用的处理器时间的近似值。我不确定其他平台,但在 Linux 上,您应该使用 clock_gettime ()CLOCK_MONOTONIC 标志 - 这将为您提供真正的挂墙时间。此外,您可以阅读TSC,但请注意,如果您有一个多处理器系统并且您的进程未固定到特定内核,则它不会工作。如果你想分析和优化你的算法,我建议你使用一些性能测量工具。我使用 Intel 的 vTune 已经有一段时间了,我很高兴。它不仅会向您显示哪个部分使用的周期最多,还会突出显示内存问题、可能的并行性问题等。您可能会对结果感到非常惊讶。例如,大部分 CPU 周期可能都花在等待内存总线上。希望对您有所帮助!

更新:实际上,如果您运行更高版本的 Linux,它可能会提供CLOCK_MONOTONIC_RAW,这是一个基于硬件的时钟,不受 NTP 调整的影响。这是您可以使用的一小段代码:

【讨论】:

  • 您的答案遭受“全世界都是 Linux/i386”(历史上是“全世界都是 VAX”)。海报展示了纯 C89 代码。除非另有说明,否则我们应该假设他想要一个便携式解决方案。我欢迎您对 clock() 的准确性发表评论;但是使用 TSC 获得系统特定,多核等可能对显然在 C 中迈出第一步的人没有帮助(比如被遗忘的 :-)
  • @Jens:你在这个问题上是不对的。 clock_gettime() 和 Linux 一样可移植(并且符合 SUSv2 和 POSIX.1-2001),Windows 有 QueryPerformanceCounter 和 QueryPerformanceFrequency,Mac 有mach_absolute_time。所有平台上都没有易于使用的纳秒精度时钟。而clock () 功能几乎没用。
  • 请理解您做了很多假设。除了clock(),您提到的所有内容都是特定于操作系统的:Linux、clock_gettime、TSC、vTune。如果 OP 在 Solaris/Sparc 上怎么办? AIX/RS6000?手臂?电源PC?苹果系统?那么你的大部分答案对你们俩来说都是浪费时间。在做出假设之前先询问 OP 说明他的要求是明智的。或者至少清楚地说明你的假设。就是这样。
【解决方案2】:

请注意,clock() 以时钟节拍返回执行时间,而不是挂钟时间。将两个 clock_t 值的差除以 CLOCKS_PER_SEC 以将差转换为秒。 CLOCKS_PER_SEC 的实际值是实施质量问题。如果它很低(比如 50),您的进程必须运行 20 毫秒才能导致来自clock() 的非零返回值。确保您的代码运行足够长的时间以看到 clock() 增加。

【讨论】:

  • CLOCKS_PER_SEC 等于1000000,并且不依赖于 POSIX 定义的 CPU 频率。
  • 仅当操作系统符合 POSIX XSI 扩展时才适用。 ISO C99 没有对CLOCKS_PER_SEC 的价值做出这样的声明,并且张贴者没有指定任何操作系统。
【解决方案3】:

我通常这样做:

clock_t start = clock();
clock_t end;

//algo

end = clock();
printf("%f", (double)(end - start));

【讨论】:

  • 那么您很可能没有执行足够多的指令来获得足够长的执行时间。尝试长时间运行 for/while(我会做一个简单的 for (int i = 0; i
  • gettimeofday 函数有效......至少给出了一个非零值。我正在尝试获取对数组进行排序所花费的时间.....通过增加要排序的数组的大小,函数 clock() 可以正常工作。
【解决方案4】:

考虑下面的代码:

#include <stdio.h>
#include <time.h>

int main()
{
    clock_t t1, t2;
    t1 = t2 = clock();

    // loop until t2 gets a different value
    while(t1 == t2)
        t2 = clock();

    // print resolution of clock()
    printf("%f ms\n", (double)(t2 - t1) / CLOCKS_PER_SEC * 1000);

    return 0;
}

输出:

$ ./a.out 
10.000000 ms

可能是您的算法运行时间比这更短。 使用gettimeofday 获得更高分辨率的计时器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多