php中inlcude()性能对比详解
2024-05-04 22:28:09
供稿:网友
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的代码,其中输出了一行字符串,如果去掉这行输出后再比较,会是什么样的结果呢?