php中inlcude()性能对比详解


Posted in PHP onSeptember 16, 2012

include性能

include('include.php');

当然这种方式并没有错误,只不过在效率上它比下面的方式要稍稍差些:

include(realpath(dirname(_FILE_)).DIRECTORY_SEPARATOR.'include.php');

这种方式我们可能需要输入更多一些,但相对于前面那种需要PHP引擎去include_path 中迭代查找所有名称为'include.php'才能查找到相应对象来说,dirname(__FILE__)这种绝对路径的指定会让系统迅速定位到相应文件。

在PHP中常量__FILE__ 其实跟C#中的AppDomain.CurrentDomain.BaseDirectory非常类似,它返回的是当前代码正在执行的代码所在文件的绝对路径。而函数dirname()则返回其父文件夹路径。
另外一个更查找效率高,并且书写简单的方式是include('./include.php'),这相当于告诉系统查找当前路径下的'include.php'文件。

在大型系统中我们常常使用另外一个更好的方式,我们常常在路由文件或其他初始化文件中加入如下代码:

define('APP_PATH',realpath(dirname(_FILE_)));

这相当于给系统添加了一个全局变量来指出系统根目录,当我们后面需要引用某具体路径下的文件时我们就可以使用如下代码了:
include(APP_PATH.DIRECTORY_SEPARATOR.'models'.'User.php');

autoload与include性能比较

例如有以下四个脚本:

#file:include1.php 
include 'include2.php'; 
//@todo something#file:include2.php 
//@todo something#file:script1.php 
include 'include2.php'; 
//@todo something 
#file:script2.php 
include 'include1.php'; 
include 'script1.php' 
//@todo something

当执行script1.php时, include ‘include2.php'; 这行代码被执行了一次。而执行script2.php时,这行代码被执行了两次。
这里只是一个简单的例子,在实际的项目中,include2.php被include的次数可能更多。这样反复的include,是否会影响性能呢?为此我写了个脚本来测试。
#file:SimpleClass.php 
class SimpleClass { 
public function __construct() { 
echo get_time() . "rn"; 
} 
} 
#file:php_include.php 
for($i = 0;$i < $loop;$i++) { 
include_once "SimpleClass.php"; 
new SimpleClass(); 
}

当$loop值为1时,脚本耗时约0.00018906593322754秒,当$loop为1000时,脚本耗时约0.076701879501343秒。

如果我们用autoload实现呢?

#file:php_autoload.php 
function __autoload($class_name) { 
include_once $class_name . '.php'; 
}for($i = 0;$i < $loop;$i++) { 
new SimpleClass(); 
}

在这段代码中,我定义了__autoload函数,几乎一样的脚本,当$loop为1时,耗时0.0002131462097168秒,而当$loop为1000时,耗时仅为前面代码的1/7,0.012391805648804秒。
但请注意看SimpleClass的代码,其中输出了一行字符串,如果去掉这行输出后再比较,会是什么样的结果呢?

在$loop同为1000的情况下,前者耗时0.057836055755615秒,而使用了autoload后,仅仅0.00199294090271秒!效率相差近30倍!

从上面的测试可以看出,当文件仅仅被include一次,autoload会消耗稍微多一点的时间,但如果在文件被反复include的情况下,使用autoload则能大大提高系统性能。
至于是否要使用autoload来解放程序员,这就仁者见仁,智者见智了。在我看来,条件允许的前提下,牺牲这一点性能(某些情况下,甚至可能是提升性能)更为便捷的开发,是值得的。

include()和require()性能

对include()来说,在 include()执行时文件每次都要进行读取和评估;
而对于require()来说,文件只处理一次(实际上,文件内容替换了require()语句)。
这就意味着如果有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高。
另一方面,如果每次执行代码时相读取不同的文件,或者有通过一组文件叠代的循环,就使用include(),
因为可以给想要包括的文件名设置一个变量,当参数为include()时使用这个变量。

PHP 相关文章推荐
zend framework多模块多布局配置
Feb 26 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 PHP
简单谈谈favicon
Jun 10 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
Dec 15 PHP
PHP常用算法和数据结构示例(必看篇)
Mar 15 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 PHP
微博短链接算法php版本实现代码
Sep 15 #PHP
PHP优于Node.js的五大理由分享
Sep 15 #PHP
PHP的autoload机制的实现解析
Sep 15 #PHP
PHP中数组合并的两种方法及区别介绍
Sep 14 #PHP
PHP合并两个数组的两种方式的异同
Sep 14 #PHP
PHP数据流应用的一个简单实例
Sep 14 #PHP
分享一下贝贝成长进度的php代码
Sep 14 #PHP
You might like
基于文本的访客签到簿
2006/10/09 PHP
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
php日期操作技巧小结
2016/06/25 PHP
功能强大的php文件上传类
2016/08/29 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
eslint+prettier统一代码风格的实现方法
2020/07/22 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
使用Python操作Elasticsearch数据索引的教程
2015/04/08 Python
Python的randrange()方法使用教程
2015/05/15 Python
Python KMeans聚类问题分析
2018/02/23 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
英国女装网上商店:I Saw It First
2018/10/18 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
大学生自我鉴定评语
2014/01/27 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
护士的自我鉴定
2014/02/07 职场文书
社区交通安全实施方案
2014/03/22 职场文书
小学家长评语大全
2014/04/16 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript