细细品味PHP程序的算法-程序员宅基地

技术标签: 算法  file  测试  php  fp  

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 是多大的差别呀!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/strongerplulu/article/details/2525470

智能推荐

通过键盘码控制图像移动_c# 控制两张不同的图片移动-程序员宅基地

文章浏览阅读312次。通过键盘码控制图像移动这是代码运行后页面的效果图它们的效果是当你点击<键盘键时那张马里奥的图片将向左移动;点击<键时马里奥图片将向右移动;点击↑键时马里奥将向上移动;点击↓键时马里奥将向下移动;点击w键时羊驼图片将向上移动;点击s键时羊驼将向下移动;点击a键时羊驼将向左移动;点击d键时羊驼将向右移动;在这个页面上只布局了两张图片通过下面的代码可以实现图片的向左和向右移动;这是布局部分<body> <di..._c# 控制两张不同的图片移动

Android中使用gzip传递数据-程序员宅基地

文章浏览阅读381次。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。作者在写这篇博客时经过测试,4.4MB的文本数据经过Gzip传输到客户端之后变为392KB,压缩效率极高。一.服务端服务端有2种方式去压缩,一种可以自己压缩,但是更推

Vue 图书管理案例_vue.js做图书管理案例-程序员宅基地

文章浏览阅读615次,点赞5次,收藏11次。这篇文章主要为大家详细介绍了vue.js实现图书管理功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=de_vue.js做图书管理案例

MyBatis逆向工程代码的生成以及使用详解(持续更新)_mybatis逆向工程查指定字段-程序员宅基地

文章浏览阅读10w+次,点赞148次,收藏652次。啊_mybatis逆向工程查指定字段

armv6,armv7,armv7s,arm64对应的机型以及报armv7s错误时的解决办法_showing recent issues the armv7 architecture is de-程序员宅基地

文章浏览阅读3.1k次。armv6:iphone 2G / 3G ipod 1G / 2Garmv7:iphone 3GS / 4 / 4S_showing recent issues the armv7 architecture is deprecated. you should updat

JAVA框架08 -- Spring Data JPA-程序员宅基地

文章浏览阅读286次。Spring Data JPASpring Data JPA概述Spring Data JPA 让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操..._java data jpa

随便推点

最全面的AndroidStudio配置指南总结-包括护眼模式-程序员宅基地

文章浏览阅读3.7k次。使用AndroidStudio开发APP已有半年多的时间了,从刚开始的不习惯到慢慢适应再到逐渐喜欢上AndroidStudio,中间的过程颇有一番曲折,现在把自己对AndroidStudio的配置心得总结下来,分享给大家,希望给后来人带来方便。强迫症童鞋的护眼模式设置方法传统模式的编辑域护眼模式的编辑域设置保护视力颜色 #C7EDCC(护眼绿)

【批处理DOS-CMD命令-汇总和小结】-跳转、循环、条件命令(goto、errorlevel、if、for[读取、切分、提取字符串]、)cmd命令错误汇总,cmd错误_cmd errorlevel-程序员宅基地

文章浏览阅读4k次,点赞5次,收藏28次。此文主要研究对代码分支化执行和重复利用的实现。分支化执行指根据中途的实际执行结果决定下一步执行的代码,跳转的代码行号;分支化执行大概分为跳转执行、条件判断执行;因此,分支化执行基本是只执行部分代码,部分代码不执行。代码重复利用的实现,一方面依赖程序调用(详见本人写的CMD命令实现程序调用一文),另一方面基于循环命令。打印goto命令的帮助信息。我们可以看到该命令的参数只有一个label。具体应用方法——在goto命令的下方放一行,开头是英文冒号后边紧跟“分支标识符”,然后再goto所在行后面加上“分支标识符_cmd errorlevel

Java面试宝典2013版-程序员宅基地

文章浏览阅读5.4k次。Java面试宝典2013版(超长版)一. Java基础部分......................................................................................................21、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?.....22、Java有没有goto?....

一对一直播软件源码开发,圆形纯数字按钮的实现_软件圆形数字-程序员宅基地

文章浏览阅读61次。在一对一直播软件源码开发过程中,会需要各种各样的按钮来进行界面的优化,其中圆形纯数字按钮是必不可少的,接下来就一起看看圆形纯数字按钮在一对一直播软件源码中时如何实现的吧。一、自定义按钮控件RelativeLayoutpublic class KeyboardView extends RelativeLayout { Context mContext; private GridView gridView; private List<Map<String, String&_软件圆形数字

JS数组字母排序(转载)_js数组按照字母排序的方法-程序员宅基地

文章浏览阅读1.6k次。//对数组中的多个对象对某一个字段按照字母先后顺序排序var array = [ {"id":"111","user":"D"}, {"id":"222","user":"B"}, {"id":"111","user":"A"}, {"id":"333","user":"C"}, {"id":"444","user":"F"}, {"id":"555","user":"E"} ];//对数组中的_js数组按照字母排序的方法

亲测好用的数据恢复软件:Disk Drill Mac中文版_disk drill for mac-程序员宅基地

文章浏览阅读1.8k次。Disk Drill Enterprise for Mac是一款运行在Mac平台上的数据恢复软件,disk drill for mac中文版提供磁盘监控、Mac清理、恢复驱动器、数据保护、数据备份等实用的功能,disk drill mac版支持快速扫描和深度扫描,所有丢失的数据都可以帮你找回。Disk Drill Enterprise for Mac软件介绍Disk Drill是一个非常宝贵的自己动手的数据恢复OS X工具。没有其他适用于Mac的数据恢复软件也很容易使用。无论数据丢失的原因 - _disk drill for mac