百度面试题及我的解答(5)-1 找出下一步需要优化的内容

 

下表是step6,使用最大的输入样本dict1 (2.6M),测试得到的性能数据。

注意底色是黄色的函数,那些都是主要处理函数。

Add调用了467371次,消耗了1537时间。

TraverseTbl调用1次,消耗了662时间。

getline调用了46731次,消耗了467时间。

这时,Add成为了瓶颈了。

 

 调用次数已用包含时间应用程序包含时间
_wmain12753.6044612753.604461
step6(void)12753.6040562753.604056
@__security_check_cookie@410.0000360.000036
@_RTC_CheckStackVars@810.0000870.000087
__RTC_CheckEsp9347606.5797886.579788
GetTickCount40.0006130.000613
HashMethod1::Add(char *)4673711537.7463511537.746351
HashMethod1::HashMethod1(void)10.0000420.000042
HashMethod1::InitHashTbl(int)122.92961622.929616
HashMethod1::TraverseTbl(void (*)(struct tag_WORD_NODE *,class std::basic_ostream<char,struct std::char_traits<char> > &),class std::basic_ostream<char,struct std::char_traits<char> > &)1662.531329662.531329
std::basic_ifstream<char,struct std::char_traits<char> >::`vbase destructor'(void)10.002790.00279
std::basic_ifstream<char,struct std::char_traits<char> >::basic_ifstream<char,struct std::char_traits<char> >(void)10.0053820.005382
std::basic_ifstream<char,struct std::char_traits<char> >::close(void)10.0449060.044906
std::basic_ifstream<char,struct std::char_traits<char> >::is_open(void)10.0001870.000187
std::basic_ifstream<char,struct std::char_traits<char> >::open(char const *,int,int)10.1084560.108456
std::basic_istream<char,struct std::char_traits<char> >::getline(char *,int)467371467.522831467.522831
std::basic_ofstream<char,struct std::char_traits<char> >::`vbase destructor'(void)10.0155220.015522
std::basic_ofstream<char,struct std::char_traits<char> >::basic_ofstream<char,struct std::char_traits<char> >(char const *,int,int)10.3412370.341237
std::basic_ofstream<char,struct std::char_traits<char> >::close(void)13.0338113.033811
std::basic_ostream<char,struct std::char_traits<char> >::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > & (*)(class std::basic_ostream<char,struct std::char_traits<char> > &))20.1010210.101021
std::basic_ostream<char,struct std::char_traits<char> >::operator<<(unsigned long)21.1726931.172693
std::ios_base::eof(void)46737226.13500226.135002
THUNK:memset10.0001150.000115
THUNK:operator new10.0029340.002934

 

继续对Add函数做性能分析,这时标准算法sort成为了瓶颈了。

sort在这里主要用来排序每个单词中的字母,使其字母序排列。在最终的输出中使用字母排序后的单词比较来确定两个单词是不是变位词。

 调用次数已用包含时间应用程序包含时间
HashMethod1::Add(char *)4673711537.7463511537.746351
__RTC_CheckEsp4673712.1200282.120028
BUF<char>::GetMem(unsigned int)93474249.46428549.464285
BUF<struct tag_WORD_NODE>::GetMem(void)46737127.77779127.777791
std::sort<char *>(char *,char *)4673711270.8947291270.894729
THUNK:strcpy93474255.72882355.728823
THUNK:strlen46737129.61929329.619293

 

关于sort的优化:

       第一个思路是:自己编写排序函数。应该会有提高。

       第二个思路是:把sort过程移到TraverseTbl中,后续会并行化该程序。初步估计只有TraverseTbl能被并行。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值