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 4.2书写安全的脚本
Oct 09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
在PHP中使用redis
Nov 04 PHP
php strnatcmp()函数的用法总结
Nov 27 PHP
php 批量添加多行文本框textarea一行一个
Jun 03 PHP
PHP中array_keys和array_unique函数源码的分析
Feb 26 PHP
Zend Framework动作助手Json用法实例分析
Mar 05 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
使用php自动备份数据库表的实现方法
Jul 28 PHP
PHP获取星期几的常用方法小结
Dec 18 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
Apr 27 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
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
php生成html文件方法总结
2014/12/01 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
2016/12/28 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
python操作yaml说明
2020/04/08 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
波兰补充商店:Muscle Power
2018/10/29 全球购物
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
《都江堰》教学反思
2014/02/07 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python