我正在寻找一种标准方法来识别程序的运行时间复杂度。如此处所述,我不是在寻找通过查看代码来分析相同问题的解决方案,而不是在程序运行时通过其他一些参数。
考虑一个要求用户将二进制字符串转换为其十进制等效项的程序。当一次处理每个二进制数字时,这种程序的时间复杂度最坏应该是 O(n)。有了一些智能,运行时间可以减少到 O(n/4)(一次处理来自二进制字符串的 4 位数字,假设二进制字符串对于所有 k=1,2,3 都有 4k 位......)
我用 C 语言编写了这个程序,并使用 time 命令和一个使用 gettimeoftheday(两者)的函数来计算具有 64 位四核处理器(每个内核为 800 MHZ)的 linux 机器上的运行时间,分为两类:
- 系统正常负载时(核心使用率 5-10%)
- 系统负载较重时(核心使用率 80-90%)
以下是 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
我在找什么:
- 如果我使用 time 命令,我应该考虑哪个输出?真实的,用户还是系统?
- 是否有计算程序运行时间的标准方法?
- 每次执行这些命令时,我都会得到不同的读数。考虑到代码不变,我应该采样多少次才能使平均值始终相同。
- 如果我想使用多个线程并通过在此类程序上调用 execve 来测量每个线程中的时间怎么办。
根据我所做的研究,我没有遇到任何标准方法。此外,我似乎使用的任何命令/方法每次都会给我不同的输出(我理解这是因为上下文切换和 cpu 周期)。我们可以在这里假设我什至可以使用依赖于机器的解决方案。