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 syntax error, unexpected $end 错误的一种原因及解决
Oct 25 PHP
php不用内置函数对数组排序的两个算法代码
Feb 08 PHP
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
ThinkPHP采用模块和操作分析
Apr 18 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
Nov 05 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
Laravel中间件实现原理详解
Oct 09 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
thinkPHP模板中函数的使用方法示例
Nov 30 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
php判断数组是否为空的实例方法
May 10 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
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
用javascript实现的激活输入框后隐藏初始内容
2007/06/29 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
vue2.x数组劫持原理的实现
2020/04/19 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
小小的船教学反思
2014/02/21 职场文书
就业协议书范本
2014/04/11 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
公司晚会主持词
2019/04/17 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫