- 论坛徽章:
- 0
|
本帖最后由 sonicling 于 2012-09-05 00:36 编辑
回复 11# OwnWaterloo
啥时候升级到Team System版本试试。或者移植到linux下用gprof测试一下,反正只用到了标准库,系统库已经做了预见性转接,没有使用第三方库。
说起来手工检查性能也有好处,就是可以快速看到想看到的内容,作简单分析即可快速得到结论。经过两天的折腾,程序性能还是提高了不少。
"generic_parser::parse" spent 2855ms
"main" spent 2933ms // main 调用了 generic_parser::parse,多出的时间是初始化时间+误差。
// 后面是累加计时器的输出,打印的是对应函数所有被调用总运行时间。
"RUN PROCESSOR in processor_manager<class abstract_node_info,class abstract_parser,struct cpp_processor_factory>::process" spent 764ms
"cpp_parser::parse_ast_node" spent 1137ms // parse_ast_node调用了上面那个函数,多出的时间是查询数据+误差
"generic_parser<class abstract_node_info,struct cpp_parser_package<struct comment_filter> >::parse_ast" spent 1325ms // 该函数调用了上面那个函数,多出的时间基本是误差
"ast_parser<class abstract_node_info>::process_definition" spent 204ms
"generic_processor<class abstract_node_info,struct cpp_parser_package<struct comment_filter> >::reduce" spent 1825ms // 该函数调用了上面两个函数,多出的时间是倒腾数据+误差
struct agc::allocator<char> -- Memory Usage Report :
Maximum Usage : 929 KB
最后那个reduce函数是据信调用最频繁,工作量也最大的函数。
这里面的误差是个很头疼的东西。这个GetThreadTimes导致的误差不光影响了感官,被调用函数的计时也会影响调用者的计时。如果只执行1次,那个误差其实可以忽略不计。但是那些累加出来的数据也包含了累加的误差,调用越频繁误差越大。这是个很头疼的问题。instrumentation方式的自动测试应该也有误差,不知道有多大。基于采样的方式想来应该有统计误差,就是说可能存在漏掉的数据(我不清楚具体的实现方法,设想如此)。
取消所有测试点后的结果:
"main" spent 1856ms
struct agc::allocator<char> -- Memory Usage Report :
Maximum Usage : 929 KB
除去reduce函数之外,还有1s的时间用在其他部分。目前还没着手分析。就这么手动分析了两天,总时间已经从2800+ms缩小到1800+。
不过手动分析需要先对程序结构进行精确的掌握,然后就是需要大量的编译时间,因为所有的计时点是人工有针对性选择的,每修改一次计时点就要重新编译,再对程序提出修改方案并实施,又要编译。估计这两天有一大半的时间耗在编译工程上了。
|
|