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 相关文章推荐
一段php加密解密的代码
Oct 09 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
坏狼php学习 计数器实例代码
Jun 15 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
php后台程序与Javascript的两种交互方式
Oct 25 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
PHP简单获取及判断提交来源的方法
Apr 22 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
php中上传文件的的解决方案
Sep 25 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
PHP读取目录下所有文件的代码
2008/01/07 PHP
php修改时间格式的代码
2011/05/29 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
详解Python 正则表达式模块
2018/11/05 Python
python3实现逐字输出的方法
2019/01/23 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
python绘制分布折线图的示例
2020/09/24 Python
快速创建python 虚拟环境
2020/11/28 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
荟萃全球保健品:维他购
2018/05/09 全球购物
abstract是什么意思
2012/02/12 面试题
2014年社区学雷锋活动总结
2014/03/09 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
Python装饰器的练习题
2021/11/23 Python