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中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
Linux下安装PHP MSSQL扩展教程
Oct 24 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
php定义参数数量可变的函数用法实例
Mar 16 PHP
PHP加密解密类实例分析
Apr 20 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
Aug 18 PHP
thinkphp3.2.0 setInc方法 源码全面解析
Jan 29 PHP
PHP调用全国天气预报数据接口查询天气示例
Feb 20 PHP
详解PHP Swoole与TCP三次握手
May 27 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往windows中添加用户
2006/12/06 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
react native 文字轮播的实现示例
2018/07/27 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
python批量修改文件后缀示例代码分享
2013/12/24 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
python程序输出无内容的解决方式
2020/04/09 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
python Scrapy框架原理解析
2021/01/04 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
原装进口全世界:天猫国际
2016/08/03 全球购物
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
Farah官方网站:男士服装及配件
2019/11/01 全球购物
社区党风廉政建设调研报告
2015/01/01 职场文书
Redis实战高并发之扣减库存项目
2022/04/14 Redis