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 相关文章推荐
substr()函数中文版
Oct 09 PHP
图书管理程序(一)
Oct 09 PHP
支持oicq头像的留言簿(一)
Oct 09 PHP
使用php来实现网络服务
Sep 15 PHP
PHP数据过滤的方法
Oct 30 PHP
php内存缓存实现方法
Jan 24 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
Oct 21 PHP
laravel model 两表联查示例
Oct 24 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
实用函数10
2007/11/08 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
Python基于有道实现英汉字典功能
2015/07/25 Python
对Python中的@classmethod用法详解
2018/04/21 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
工业学校毕业生自荐信范文
2014/01/03 职场文书
教学大赛获奖感言
2014/01/15 职场文书
顶撞领导检讨书
2014/01/29 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
导游词之任弼时故居
2020/01/07 职场文书
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python
Python 如何解决稀疏矩阵运算
2021/05/26 Python