PHPWind与Discuz截取字符函数substrs与cutstr性能比较


Posted in PHP onDecember 05, 2011

以掌握使用Benchmark_Iterate类工具的方法。

目录
一,什么是PEAR与Benchmark
二,性能比较代码准备与调试
三,性能比较测试结果
四,性能比较测试总结
五,附性能比较源代码下载

一,什么是PEAR与Benchmark

请参考PHP性能优化系列
第二期 PHP性能优化工具篇Benchmark类调试执行时间
第一期 PHP性能优化准备篇图解PEAR安装

二,性能比较代码准备与调试

测试环境说明
操作系统:Windows xp Service Pack 3
PHP版本:PHP Version 5.2.11
Apache版本:Apache 2.0 Handler

第一步,下载phpwind与discuz!程序源代码
1,下载 phpwind v7.5sp3 论坛版 安装包:简体 GBK
2,下载 Discuz! 7.2_FULL(含UCenter) 简体GBK

第二步,分别获取两个程序的截取字符函数substrs()和cutstr(),其中PHPWind截取字符函数substrs()由两个函数组成,分别是substrs与utf8_trim函数。

function substrs($content,$length,$add='Y'){ 
if (strlen($content)>$length) { 
if ($GLOBALS['db_charset']!='utf-8') { 
$retstr = ''; 
for ($i=0;$i<$length-2;$i++) { 
$retstr .= ord($content[$i]) > 127 ? $content[$i].$content[++$i] : $content[$i]; 
} 
return $retstr.($add=='Y' ? ' ..' : ''); 
} 
return utf8_trim(substr($content,0,$length)).($add=='Y' ? ' ..' : ''); 
} 
return $content; 
} 
function utf8_trim($str) { 
$hex = ''; 
$len = strlen($str)-1; 
for ($i=$len;$i>=0;$i-=1) { 
$ch = ord($str[$i]); 
$hex .= " $ch"; 
if (($ch & 128)==0 || ($ch & 192)==192) { 
return substr($str,0,$i); 
} 
} 
return $str.$hex; 
} function cutstr($string, $length, $dot = ' ...') { 
global $charset; 
if(strlen($string) <= $length) { 
return $string; 
} 
$string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string); 
$strcut = ''; 
if(strtolower($charset) == 'utf-8') { 
$n = $tn = $noc = 0; 
while($n < strlen($string)) { 
$t = ord($string[$n]); 
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { 
$tn = 1; $n++; $noc++; 
} elseif(194 <= $t && $t <= 223) { 
$tn = 2; $n += 2; $noc += 2; 
} elseif(224 <= $t && $t <= 239) { 
$tn = 3; $n += 3; $noc += 2; 
} elseif(240 <= $t && $t <= 247) { 
$tn = 4; $n += 4; $noc += 2; 
} elseif(248 <= $t && $t <= 251) { 
$tn = 5; $n += 5; $noc += 2; 
} elseif($t == 252 || $t == 253) { 
$tn = 6; $n += 6; $noc += 2; 
} else { 
$n++; 
} 
if($noc >= $length) { 
break; 
} 
} 
if($noc > $length) { 
$n -= $tn; 
} 
$strcut = substr($string, 0, $n); 
} else { 
for($i = 0; $i < $length; $i++) { 
$strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i]; 
} 
} 
$strcut = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $strcut); 
return $strcut.$dot; 
}

第三步,编写使用PEAR Benchmark_Iterate类调试的代码
<?php 
require_once "Benchmark/Iterate.php"; 
$bench = new Benchmark_Iterate; 
$charset = $GLOBALS['db_charset'] = 'gbk';//utf-8 
$content = "今年春晚,我特地关注了赵本山的新小品《捐助》,这篇小品对弱势群体的不尊重并无改变,小品讲的是赵本山与其弟子扮演两个捐助者..."; /*phpwind*/ 
$bench->run(50,"substrs",$content,30); 
/*discuz*/ 
//$bench->run(50,"cutstr",$content,30); 
$result = $bench->get(); 
?>

分别切换substrs和cutstr两个函数并且调用50次获取两个函数执行的平均时间。
三,性能比较测试结果

1,PHPWind程序substrs函数当截取字符编码为GBK的情况
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
图解:PHPWind程序substrs函数截取GBK编码的字符平均时间在0.0014s-0.0015s之间,纵坐标表示执行的时间,横坐标表示执行的次数,图表中mean表示平均执行时间,注s表示秒

2,Discuz!程序cutstr函数当截取字符编码为GBK的情况
PHPWind与Discuz截取字符函数substrs与cutstr性能比较

图解:Discuz!程序cutstr函数截取GBK编码的字符平均时间在0.0016s-0.0018s之间

3,PHPWind程序substrs函数当截取字符编码为UTF-8的情况
PHPWind与Discuz截取字符函数substrs与cutstr性能比较

图解:PHPWind程序substrs函数截取UTF-8编码的字符平均时间在0.001s-0.0012s之间

4,Discuz!程序cutstr函数当截取字符编码为UTF-8的情况
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
图解:Discuz!程序cutstr函数截取UTF-8编码的字符平均时间在0.0044s-0.0052s之间

四,性能比较测试总结

如上使用PEAR的Benchmark_Iterate类比较了两个截取字符函数的执行性能,在实际的代码开发过程中,为了保证代码的效率与性能,我们可以采取同样的方法来分析函数的执行性能或问题,这个非常有用!

本文通过比较PHPWind与Discuz两个社区论坛产品的截取字符函数substrs与cutstr的执行性能情况为例,谈谈PEAR Benchmark_Iterate类在实际开发中的应用,请继续关注下期的PHP性能优化系列。

PHP 相关文章推荐
PHP系统流量分析的程序
Oct 09 PHP
一个MYSQL操作类
Nov 16 PHP
数字转英文
Dec 06 PHP
木翼下载系统中说明的PHP安全配置方法
Jun 16 PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
PHP函数学习之PHP函数点评
Jul 05 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
zf框架db类的分页示例分享
Mar 14 PHP
PHP中__FILE__、dirname与basename用法实例分析
Dec 01 PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 #PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 #PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 #PHP
PHP详解ASCII码对照表与字符转换
Dec 05 #PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
Dec 01 #PHP
PHP循环语句笔记(foreach,list)
Nov 29 #PHP
openPNE常用方法分享
Nov 29 #PHP
You might like
php的memcached客户端memcached
2011/06/14 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
php实现图片压缩处理
2020/09/09 PHP
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
Python求解平方根的方法
2015/03/11 Python
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
使用python实现快速搭建简易的FTP服务器
2018/09/12 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
使用python制作一个解压缩软件
2019/11/13 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
工程总经理工作职责
2013/12/09 职场文书
学校消防安全制度
2014/01/30 职场文书
简历中自我评价怎么写
2014/02/12 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
订货会邀请函
2015/01/31 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
python - asyncio异步编程
2021/04/06 Python