用任何编程语言测量程序的时间复杂度

时间:2013-05-15 08:03:04

标签: c performance algorithm time c++11

我正在寻找一种识别程序运行时间复杂性的标准方法。 如here所述,我不是通过查看代码而不是通过程序运行时的其他参数来搜索分析相同的解决方案。

考虑一个程序,该程序要求用户将二进制字符串转换为其十进制等效值。当每次处理每个二进制数字时,这种程序的时间复杂度最好是O(n)。有了一些智能,运行时间可以减少到O(n / 4)(一次处理来自二进制字符串的4位数,假设二进制字符串对于所有k = 1,2,3都有4k位数...)

我在C中编写了这个程序并使用了time命令和一个使用gettimeoftheday(两者)的函数来计算具有64位四核处理器(每个核心在800 MHZ)的linux机箱上的运行时间,分为两类: / p>

  1. 当系统处于正常负载(核心使用率5-10%)时
  2. 当系统负载很重(核心使用率80-90%)时
  3. 以下是O(n)算法的读数,二进制字符串的长度为100000,正常负载下:

    Time spent in User (ms) - 216
    Time Spent in Kernel (ms) - 8
    Timed using gettimeofday (ms) - 97
    

    以下是O(n)算法的读数,二进制字符串的长度为200000,在高负载下:

    Time spent in User (ms) - 400
    Time Spent in Kernel (ms) - 48
    Timed using gettimeofday (ms) - 190
    

    我在寻找什么:

    1. 如果我正在使用时间命令,我应该考虑哪个输出?真实的,用户还是系统?
    2. 是否有标准方法来计算程序的运行时间?
    3. 每次执行这些命令时,我都会得到不同的读数。考虑到代码没有改变,我应该采样多少次以使平均值始终相同。
    4. 如果我想通过在这些程序上调用execve来使用多个线程并测量每个线程的时间,该怎么办。
    5. 根据我所做的研究,我没有遇到任何标准方法。此外,无论我使用什么命令/方法,每次都给我一个不同的输出(我明白这是因为上下文切换和cpu循环)。我们可以假设我甚至可以使用依赖于机器的解决方案。

1 个答案:

答案 0 :(得分:0)

回答你的问题:

  1. 取决于您的代码正在做什么time输出的每个组件可能都很重要。 This问题涉及这些组成部分的含义。如果您正在计时的代码不使用系统调用,那么计算“用户”时间可能就足够了。我可能只是使用“真实”的时间。
  2. time出了什么问题?如果你需要更好的粒度(即你只想计算一段代码而不是整个程序),你总是可以在你正在分析的代码块之前得到开始时间,运行代码然后得到结束时间然后计算差异给你运行时。 从不 使用gettimeofday因为时间没有单调增加。系统时间可以由管理员或NTP进程更改。您应该使用clock_gettime代替。
  3. 为了最大限度地减少运行时的运行时间差异,我会检查cpu频率缩放是否 OFF ,尤其是如果你得到非常不同的结果。这让我感到很震惊。
  4. 一旦开始涉及多个线程,您可能想要开始查看分析器。 gprof是一个很好的起点。