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 相关文章推荐
动态生成gif格式的图像要注意?
Oct 09 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 PHP
php 截取字符串并以零补齐str_pad() 函数
May 07 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
smarty循环嵌套用法示例分析
Jul 19 PHP
PHP查看SSL证书信息的方法
Sep 22 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 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
中国收音机工业发展史
2021/03/02 无线电
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python中__call__方法示例分析
2014/10/11 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
详解python eval函数的妙用
2017/11/16 Python
python3实现字符串操作的实例代码
2019/04/16 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
医学院毕业生自荐信
2013/11/08 职场文书
《和我们一样享受春天》教学反思
2014/02/07 职场文书
小学优秀教师材料
2014/12/15 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技