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开发GUI
Oct 09 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 PHP
Web程序工作原理详解
Dec 25 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
详解PHP swoole process的使用方法
Aug 26 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
php图片裁剪函数
Oct 31 PHP
Yii框架安装简明教程
May 15 PHP
PHP7移除的扩展和SAPI
Mar 09 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 中执行排序与 MySQL 中排序
2009/04/21 PHP
PHP之短标签开启设置
2013/06/17 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
javascript实现微信分享
2014/12/23 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
javaScript基础详解
2017/01/19 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
pycharm 使用心得(三)Hello world!
2014/06/05 Python
python文件和目录操作函数小结
2014/07/11 Python
使用Python生成url短链接的方法
2015/05/04 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
python科学计算之narray对象用法
2019/11/25 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
基于Python实现简单学生管理系统
2020/07/24 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
Bootstrap 学习分享
2012/11/12 HTML / CSS
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
模具设计与制造专业自荐书
2014/07/01 职场文书
2015年仓库工作总结
2015/04/09 职场文书
音乐会主持人开场白
2015/05/28 职场文书
只用Python就可以制作的简单词云
2021/06/07 Python
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers