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 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
解析argc argv在php中的应用
Jun 24 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 PHP
PHP中的替代语法介绍
Jan 09 PHP
PHP正则验证Email的方法
Jun 15 PHP
php设置页面超时时间解决方法
Sep 22 PHP
php猜单词游戏
Sep 29 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
mac系统下安装多个php并自由切换的方法详解
Apr 21 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 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
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
php删除数组元素示例分享
2014/02/17 PHP
限制复选框的最大可选数
2006/07/01 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
js 居中漂浮广告
2010/03/21 Javascript
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
axios异步提交表单数据的几种方法
2019/08/11 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
分享15个最受欢迎的Python开源框架
2014/07/13 Python
简单的Python抓taobao图片爬虫
2014/10/26 Python
Python contextlib模块使用示例
2015/02/18 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Python延时操作实现方法示例
2018/08/14 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
专题组织生活会方案
2014/06/15 职场文书