我正在寻找一种识别程序运行时间复杂性的标准方法。 如here所述,我不是通过查看代码而不是通过程序运行时的其他参数来搜索分析相同的解决方案。
考虑一个程序,该程序要求用户将二进制字符串转换为其十进制等效值。当每次处理每个二进制数字时,这种程序的时间复杂度最好是O(n)。有了一些智能,运行时间可以减少到O(n / 4)(一次处理来自二进制字符串的4位数,假设二进制字符串对于所有k = 1,2,3都有4k位数...)
我在C中编写了这个程序并使用了time命令和一个使用gettimeoftheday(两者)的函数来计算具有64位四核处理器(每个核心在800 MHZ)的linux机箱上的运行时间,分为两类: / p>
以下是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
我在寻找什么:
根据我所做的研究,我没有遇到任何标准方法。此外,无论我使用什么命令/方法,每次都给我一个不同的输出(我明白这是因为上下文切换和cpu循环)。我们可以假设我甚至可以使用依赖于机器的解决方案。
答案 0 :(得分:0)
回答你的问题:
time
输出的每个组件可能都很重要。 This问题涉及这些组成部分的含义。如果您正在计时的代码不使用系统调用,那么计算“用户”时间可能就足够了。我可能只是使用“真实”的时间。time
出了什么问题?如果你需要更好的粒度(即你只想计算一段代码而不是整个程序),你总是可以在你正在分析的代码块之前得到开始时间,运行代码然后得到结束时间然后计算差异给你运行时。 从不 使用gettimeofday
因为时间没有单调增加。系统时间可以由管理员或NTP进程更改。您应该使用clock_gettime
代替。