购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3 实例2
函数的专用时间

在单线程CPU上执行一些函数。每个函数都有一个0到 N -1之间的唯一id。以时间戳顺序存储日志,这些日志描述了何时输入或退出函数。

每个日志都是以下格式的字符串:“{function_id}:{start|end}:{timestamp}”。例如,“0:start:3”表示id为0的函数,在时间3的开始处开始。“1:end:2”表示id为1的函数,在时间2的结尾处结束。

函数的专用时间是此函数所花费的时间单位。请注意,这不包括对子函数的任何递归调用。

CPU是单线程的,这意味着在给定的时间单位仅执行一个函数,返回每个函数的独占时间,按其函数id排序。

函数的专用时间示例见图3-2。

图3-2 函数的专用时间示例

输入:n=2

日志=["0:start:0","1:start:2","1:end:5","0:end:6"]

输出:[3,4]

说明:函数0在时间0的开始处开始,执行2个时间单位在时间1结束。现在函数1在时间2的开始处开始,执行4个时间单位,在时间5结束。函数0在时间6的开始处再次运行,并且在时间6的结束处结束,执行1个时间单位。因此,函数0花费2+1=3个单位的总执行时间,而函数1花费4个单位的总执行时间。

思路:首先需要解析字符串,把解析的内容写到结构体中去。如果当前节点是开始,进栈。如果是结束的节点,需要出栈,同时更新当前节点的运行时间,注意同时更新堆栈顶部节点的运行时间,即需要减去当前节点的运行时间。

比如上述例子中:

第一个log的time_flag是“start”,则压入堆栈;

第二个log的time_flag也是“start”,压入堆栈;

第三个log的time_flag是“end”,则计算当前log的运行时间,5-2+1=4,所以id=1的函数的执行时间就是4,res[1]=4,同时堆栈里面的第二个log出栈。此时堆栈里面只剩下第一个log。因为是单线程,所以要从堆栈顶部的id的时间减去当前log用掉的时间,res[0]=-4。

第四个log的time_flag是“end”,则计算当前log的运行时间,6-0+1=7,res[0]=res[0]+7=3。

代码清单3-5 函数的专用时间

运行结果: JICLF/hNuPn5UQLM0SnJtFUWxcjd+GKSlCzfRRwnbnINb9WE36dUucK9QPvwxpcq

点击中间区域
呼出菜单
上一章
目录
下一章
×