php 高性能书写


Posted in PHP onDecember 11, 2010

从.NET转去做PHP4年了,最近开始追求高性能了~~
所以开始觉得是时候要写写博客了~
来段发现物先~

$arr = array( 
'attr1' => 1 , 
'attr2' => 1 , 
'attr3' => 1 , 
); 
$startTime = microtime( true ); 
for( $i = 0 ; $i < 1000 ; $i++ ) 
{ 
if( isset( $arr['attr1'] ) ) 
{ } 
if( isset( $arr['attr2'] ) ) 
{ 
} 
if( isset( $arr['attr3'] ) ) 
{ 
} 
} 
$endTime = microtime( true ); 
printf( "%d us.\n" , ( $endTime - $startTime ) * 1000000 ); 
$startTime = microtime( true ); 
for( $i = 0 ; $i < 1000 ; $i++ ) 
{ 
foreach( $arr as $key => $value ) 
{ 
switch( $key ) 
{ 
case 'attr1': 
break; 
case 'attr2': 
break; 
case 'attr3': 
break; 
} 
} 
} 
$endTime = microtime( true ); 
printf( "%d us.\n" , ( $endTime - $startTime ) * 1000000 );

上面一段代码
输出结果是
us.
us.
然而,怎么看都是第一段比第二段繁琐,而且结构没有第二段清晰,
那么为什么第一段会比第二段执行快了这么多呢
我们可以看到第一段的代码中,只有3个if,
那么第二段会有多少个呢。
我们拆开了switch这个东西,可以去看看他的基本实现原理。
如果switch中,每一段case中都是使用break;结束的话,
其实这个switch好比多个if{}else if{}

所以从这个机制,我们就可以把的

foreach( $arr as $key => $value ) 
{ 
switch( $key ) 
{ 
case 'attr1': 
break; 
case 'attr2': 
break; 
case 'attr3': 
break; 
} 
}

转换成
foreach( $arr as $key => $value ) 
{ 
if( $key == 'attr1' ) 
{ } 
else if( $key == 'attr2' ) 
{ 
} 
else if( $key == 'attr3' ) 
{ 
} 
}

去理解,
从这里就可以看到,第二段代码会因应数组中的键的个数去不停地作出判断次数为1+2+3的判断,所以变成了第一段代码判断次数是3,而第二段代码判断次数是6次

所以就导致了执行效率相差了接近一倍的速度。

PHP 相关文章推荐
使用 eAccelerator加速PHP代码的目的
Mar 16 PHP
PHP版自动生成文章摘要
Jul 23 PHP
PHP empty函数报错解决办法
Mar 06 PHP
php实现四舍五入的方法小结
Mar 03 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
PHP生成器简单实例
May 13 PHP
PHP整合七牛实现上传文件
Jul 03 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 PHP
Laravel相关的一些故障解决
Aug 19 PHP
php foreach 参数强制类型转换的问题
Dec 10 #PHP
snoopy 强大的PHP采集类使用实例代码
Dec 09 #PHP
PHPwind整合最土系统用户同步登录实现方法
Dec 08 #PHP
php iconv() : Detected an illegal character in input string
Dec 05 #PHP
php printf输出格式使用说明
Dec 05 #PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 #PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 #PHP
You might like
PHP 截取字符串专题集合
2010/08/19 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
如何使用Python 打印各种三角形
2019/06/28 Python
python如何基于redis实现ip代理池
2020/01/17 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
技术经理的自我评价范文
2013/12/03 职场文书
党员违纪检讨书
2014/02/18 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
企业年度评优方案
2014/06/02 职场文书
海洋科学专业求职信
2014/08/10 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫