【问题标题】:Measuring an algorithms running time in terms of clock ticks根据时钟滴答测量算法运行时间
【发布时间】:2014-11-16 17:35:04
【问题描述】:

我正在使用以下代码 sn-p 来衡量我的算法在时钟滴答声方面的运行时间:

clock_t t;
t = clock();
//run algorithm
t = clock() - t;
printf ("It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);

但是,当输入大小较小时,它会返回 0。这怎么可能?

【问题讨论】:

  • 请标记您的编程语言
  • 因为一般情况下,POSIX 将CLOCKS_PER_SEC 定义为 100 万,这意味着花费 clock()返回的值不一定每次都加1;粒度可能是每次更新10个tick左右,每10us更新一次+10。
  • 您是否尝试提高printf 的精度并使用double

标签: c++ performance algorithm


【解决方案1】:

时钟具有一定的粒度,取决于您的操作系统等多种因素。

因此,您的算法可能运行得如此之快,以至于时钟没有时间更新。因此测量的持续时间为 0。

您可以尝试运行您的算法 n 次,然后将测量的时间除以 n,以更好地了解小输入所花费的时间。

【讨论】:

    【解决方案2】:

    标准 C clock() 函数的分辨率在不同系统之间可能会有很大差异,并且可能太小而无法衡量您的算法。你有两个选择:

    1. 使用操作系统特定功能
    2. 多次重复您的算法,直到需要足够长的时间才能使用 clock() 进行测量

    对于 1),如果您的程序在 windows 下运行,您可以使用 QueryPerformanceCounter() 和 QueryPerformanceFrequency(),如果在 Linux 上运行,则可以使用 clock_gettime()。

    有关详细信息,请参阅这些页面: QueryPerformanceCounter() clock_gettime()

    对于 2),您必须依次执行给定次数的算法,以便 clock() 报告的时间比 clock() 的最小粒度高几个数量级。假设 clock() 仅以 12 微秒的步长工作,那么整个测试运行所消耗的时间应该至少为 1.2 毫秒,因此您的时间测量最多有 1% 的偏差。否则,如果你测量 12 微秒的时间,你永远不知道它是跑了 12.0 微秒还是 23.9 微秒,但是下一个更大的 clock() 滴答声并没有发生。您的算法在时间测量中顺序执行的频率越高,您的时间测量就越精确。还要确保将调用复制粘贴到您的算法以进行顺序执行;如果您只是在 for 循环中使用循环计数器,这可能会严重影响您的测量!

    【讨论】:

    • 对于 Mac OS X,你想要的是 mach_absolute_time()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多