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 相关文章推荐
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 PHP
PHP中在数据库中保存Checkbox数据(1)
Oct 09 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
详谈PHP编码转换问题
Jul 28 PHP
php注册登录系统简化版
Dec 28 PHP
thinkphp分页集成实例
Jul 24 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 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 mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
深入解析PHP中SESSION反序列化机制
2017/03/01 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
由document.body和document.documentElement想到的
2009/04/13 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
Python群发邮件实例代码
2014/01/03 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Python学习笔记之装饰器
2020/08/06 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
Python用户自定义异常的实现
2020/12/25 Python
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
使用索引有什么好处
2016/07/27 面试题
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
自我评价正确写法范文
2013/12/10 职场文书
社区维稳工作方案
2014/06/06 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
同意迁入证明模板
2014/10/26 职场文书