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 新手入门教程
Aug 03 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
Jan 10 PHP
php文件操作实例代码
May 10 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
PHP系统命令函数使用分析
Jul 05 PHP
php图像处理函数大全(推荐收藏)
Jul 11 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
Dec 17 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
php实现PDO中捕获SQL语句错误的方法
Feb 16 PHP
详解PHP中的 input属性(隐藏 只读 限制)
Aug 14 PHP
PhpStorm配置Xdebug调试的方法步骤
Feb 02 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安全性问题中的:Null 字符问题
2013/06/21 PHP
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python使用arcpy.mapping模块批量出图
2017/03/06 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
超简单使用Python换脸实例
2019/03/27 Python
python issubclass 和 isinstance函数
2019/07/25 Python
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
自荐信模版
2013/10/24 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
2015学校年度工作总结
2015/05/11 职场文书
单位同意报考证明
2015/06/17 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
python使用shell脚本创建kafka连接器
2022/04/29 Python
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript