细细品味PHP程序的算法

2008-06-08 18:23
在一般的应用中,PHP的程序员会比较少的注意到php程序的细微算法对性能影响的问题,但在处理一些比较占用资源的东西的时候,适当调整算法,会让程序的性能整倍的提高。
    这几天,我在研究分词的算法,如果不预先载入词典的话,那种运算速度简直惨不忍睹,因此我考虑了预先载入词典在一个数组中的做法,我手上有一个十多万词汇的词典,开始的时候,用这样的方式载入:

$fp = fopen(dirname(__FILE__)."/mydic.txt","r");
while($wd = fgets($fp,1024)){
$ws = split("`",trim($wd));
$m_dic[$ws[0]][$ws[1]] = $ws[2];
}
fclose($fp);

这样一测试,发现分析时候慢吞吞的,后来通过检测执行时间才发现,原来载入词典居然用了 1.5 秒多,也难怪!

数据格式为:
0列:前两词的拼音,1列为:词,2列为:词的长度
如:
al`奥林匹克运动会`14
al`阿拉伯的劳伦斯`14
as`埃塞俄比亚高原`14
wp`旺铺租售`8  
wq`网球王子`8  
wq`外企服务`8


我试一下不作任运作算,只读一遍数据文件:

$fp = fopen(dirname(__FILE__)."/mydic.txt","r");
while($wd = fgets($fp,24)){
//$ws = split("`",trim($wd));
//$m_dic[$ws[0]][$ws[1]] = $ws[2];
}
fclose($fp);

经测试只用了:0.18 秒,显然真正占用时间的代码是:

$ws = split("`",trim($wd));
$m_dic[$ws[0]][$ws[1]] = $ws[2];

这两行代码,我把它换成这个样子:

$fp = fopen(dirname(__FILE__)."/mydic.txt","r");
while($wd = fgets($fp,24)){
$WordEnd = strpos($wd,"`",3);
$m_dic[$wd[0].$wd[1]][substr($wd,3,$WordEnd-3)] = ($WordEnd-3)*2;
}
fclose($fp);

这样测试就只有 0.7 秒多,然后把词典中词的长度去除,变为:

$fp = fopen(dirname(__FILE__)."/mydic.txt","r");
while($wd = fgets($fp,18)){
$WordEnd = strlen($wd)-2;// 2是"/r/n"的长度
$m_dic[$wd[0].$wd[1]][substr($wd,3,$WordEnd-3)] = ($WordEnd-3)*2;
}
fclose($fp);

又快了 0.07 秒左右,速度在 0.63 秒中徘徊,这和原来的 1.5 是多大的差别呀!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值