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 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
PHP简单系统查询模块代码打包下载
Jun 07 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
php显示时间常用方法小结
Jun 05 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
Mar 23 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
PHP 实现页面静态化的几种方法
Jul 23 PHP
php进行md5加密简单实例方法
Sep 19 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 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
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
JS input 数字验证代码
2009/07/30 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
Python获取当前时间的方法
2014/01/14 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
计算机本科生自荐信
2013/10/15 职场文书
大专自我鉴定范文
2013/10/23 职场文书
销售部主管岗位职责
2013/12/18 职场文书
银行职员自我鉴定
2014/04/20 职场文书
职位说明书范文
2014/05/07 职场文书
项目建议书怎么写
2014/05/15 职场文书
环境整治工作方案
2014/05/18 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
小平您好观后感
2015/06/09 职场文书
红白喜事主持词
2015/07/06 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫