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获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
PHP中上传多个文件的表单设计例子
Nov 19 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
Oct 09 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
mac下多个php版本快速切换的方法
Oct 09 PHP
php微信公众号开发(3)php实现简单微信文本通讯
Dec 15 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
yii2 开发api接口时优雅的处理全局异常的方法
May 14 PHP
php引用传递
Apr 01 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
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
详解Python的Lambda函数与排序
2016/10/25 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
如何获取Python简单for循环索引
2019/11/21 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
境外导游求职信
2014/02/27 职场文书
协议书范本
2014/04/23 职场文书
合伙协议书
2014/04/23 职场文书
工作证明英文模板
2014/10/21 职场文书
小学优秀班主任材料
2014/12/17 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
人民调解协议书
2016/03/21 职场文书
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers