2009年3月23日星期一

Performance profiler

driver以前主要是针对内存进行统计,一直缺乏对CPU占用率的有效统计手段。虽然可以取得脚本线程占用的时间,但是因为大量短寿命线程(如callback)的存在,加上线程内的复杂执行情况(函数嵌套),所以仅仅取得线程占用时间的作用很有限。必须手工增加很多统计代码才能实用。

考虑了一段时间,上周末的时候我借合并版本的空闲增加了一个性能诊断模块。

统计的主要思路是独起一个线程,定期去记录调用栈,然后将调用栈插入到一个树中,形成调用树,每次给被统计的调用栈在树中的末端节点计数器+1。最终,计数器总和可以看作是100%的CPU,各个结点计数和计数总和的比就是占用CPU的比率。这样,我可以得到每个调用层次不同函数的CPU占用率,也可以得到它们调用其他函数的总开销(将这个分支下面所有节点的计数累加在一起即可)

当然,统计只是一部分,还需要一个viewr,要能方便的展开这个树,并且进行同层次的排序以便阅读,另外也可以进行一些高级分析。

在实际开发的时候,如果profiler的线程采用休眠的方式的话,每秒中统计的次数太少。Mac下基本可以做到每毫秒一次,我用的Linux就不太好,而Windows最差,因为精度太低每秒只有60多次。既然目前都是双核+的机器,我让profiler线程以不休眠的方式进行,每微妙统计一次。结果下来,还是Mac最好,Linux次之,Windows最差,因为QueryPerformanceCounter实在是开销太大了,一次调用就干掉几微妙。

没有评论:

发表评论