上一篇实现,是统计了每一次函数调用的层次关系和耗时。如果在函数调用比较多的情况下,更关心的是减少输出,只需要总计的耗时即可。另外如果是后台程序,输出到文件会更好。
因此,对程序做了改进。当设置TRACELOG环境变量,则输出到这个环境变量指定的文件中。如果设置了DETAILF,则会输出调用层次关系和每一次的耗时,否则只输出总计时间。
tr.cpp改进后的程序如下。
<李>
iostream
李>
<李>
# include fstream
李>
<李>
# include向量
李>
<李>
# include
地图
李>
<李>
# include
李>
<李>
# include sysh
李>
<李>
李>
<李>
使用stdvector
李>
<李>
使用stdmap
李>
<李>
利用std
李>
<李>
使用stdclog
李>
<李>
使用stdendl
李>
<李>
使用stdofstream
李>
<李>
使用stdostream
李>
<李>
李>
<李>
外面的空白print_trace char procname
李>
<李>
李>
<李>
struct Stat
李>
<李>
李>
<李>
,,,,级
李>
<李>
,,,,名称
李>
<李>
,,,长stm
李>
<李>
,,,长etm
李>
<李>
,,,长oitv
李>
<李>
,,,Stat l s长的圣lvll名称stmst etm0 oitv0
李>
<李>
李>
<李>
李>
<李>
结构体和
李>
<李>
李>
<李>
,,,,问
李>
<李>
,,,长itv
李>
<李>
,,,和cnt0 itv0
李>
<李>
,,,和operatorlong我
李>
<李>
,,,
李>
<李>
,,,,,,,问
李>
<李>
,,,,,,,itvi
李>
<李>
,,,,,,,返回这个
李>
<李>
,,,
李>
<李>
李>
<李>
李>
<李>
名称空间
李>
<李>
李>
<李>
vectorStat tracev
李>
<李>
地图和itvm
李>
<李>
clvl 0
李>
<李>
bool detailf getenv
李>
<李>
李>
<李>
李>
<李>
外面的空白
李>
<李>
__func_trace_enter char proc_name
李>
<李>
,,,,,,,,,,,,,,,,,,char file_name
李>
<李>
,,,,,,,,,,,,,,,,,,line_no
李>
<李>
,,,,,,,,,,,,,,,,,,无效id
李>
<李>
李>
<李>
printf proc_name file_name line_no id0 charid
李>
<李>
,,,struct timeval nowtm
李>
<李>
,,,gettimeofdaynowtm
李>
<李>
,,,clvl
李>
<李>
,,,tracevpush_backStatclvl proc_namefile_name nowtmtv_sec 1000000 nowtmtv_usec
李>
<李>
李>
<李>
李>
<李>
外面的空白
李>
<李>
__func_trace_exit char proc_name
李>
<李>
,,,,,,,,,,,,,,,,,char file_name
李>
<李>
,,,,,,,,,,,,,,,,,line_no
李>
<李>
,,,,,,,,,,,,,,,,,无效id
李>
<李>
李>
<李>
printf proc_name file_name line_no id0 charid
李>
<李>
,,,struct timeval nowtm
李>
<李>
,,,,itv
李>
<李>
,,,gettimeofdaynowtm
李>
<李>
,,,汽车iter tracev 1
李>
<李>
,,,,iteretm 0
李>
<李>
,,,,,,,iter
李>
<李>
,,,iteretm nowtmtv_sec 1000000 nowtmtv_usec
李>
<李>
,,,itv iteretm iterstm iteroitv
李>
<李>
,,,itvmproc_nameitv
李>
<李>
,,,,汽车tracevbegin年代!=iter s
李>