php中inlcude()性能对比详解

2015-01-24信息快讯网

PHP程序员最常用的两个函数莫过于require_once和include了,通过这两个函数,我们可以使用其他类库中定义的类等对象。但很多人在使用包含相同目录下的其他文件时,仅仅简单使用下面的代码进行文件引用

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连接函数implode与分割explode的深入解析
解析PHP正则提取或替换img标记属性
php 在windows下配置虚拟目录的方法介绍
关于PHP自动判断字符集并转码的详解
解析如何去掉CodeIgniter URL中的index.php
提升PHP性能的21种方法介绍
解析如何修改phpmyadmin中的默认登陆超时时间
关于Sphinx创建全文检索的索引介绍
使用Sphinx对索引进行搜索
解析php框架codeigniter中如何使用框架的session
Function eregi is deprecated (解决方法)
有关PHP性能优化的介绍
php Xdebug的安装与使用详解
基于在生产环境中使用php性能测试工具xhprof的详解
记录mysql性能查询过程的使用方法
基于MySQL分区性能的详细介绍
PHP爆绝对路径方法收集整理
微博短链接算法php版本实现代码
PHP优于Node.js的五大理由分享
PHP的autoload机制的实现解析
PHP中数组合并的两种方法及区别介绍
PHP合并两个数组的两种方式的异同
header跳转和include包含问题详解
php控制linux服务器常用功能 关机 重启 开新站点等
通过缓存数据库结果提高PHP性能的原理介绍
Windows下部署Apache+PHP+MySQL运行环境实战
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
Linux下实现PHP多进程的方法分享
php中3des加密代码(完全与.net中的兼容)
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
php 调试利器debug_print_backtrace()
PHP __autoload()方法真的影响性能吗?
PHP中将字符串转化为整数(int) intval() printf() 性能测试
PHP性能优化工具篇Benchmark类调试执行时间
PHP性能优化准备篇图解PEAR安装
©2014-2024 dbsqp.com