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缩略图生成程式(需要GD库支持)
Mar 06 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
php sybase_fetch_array使用方法
Apr 15 PHP
PHPUnit安装及使用示例
Oct 29 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 PHP
PHP数组遍历的几种常见方式总结
Feb 15 PHP
phpfpm的作用和用法
Oct 10 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语言构造器介绍
2013/07/08 PHP
通过php修改xml文档内容的方法
2015/01/23 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
js变量提升深入理解
2016/09/16 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
python daemon守护进程实现
2016/08/27 Python
基于Python实现用户管理系统
2019/02/26 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
2019/08/07 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
我们的节日清明节活动总结
2014/04/30 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
签约仪式致辞
2015/07/30 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
Android Rxjava3 使用场景详解
2022/04/07 Java/Android
Java数组详细介绍及相关工具类
2022/04/14 Java/Android