PHP5:命名空间(namespace)+__autoload 执行效率比普通的__autoload快十倍以上【转】

admin 发表于 [PHP] 分类,标签: 知识总结 性能优化
0

测试环境:XP+PHP(5.3.1)+nginx(0.8.30)+Xdebug 2.0.5
文件的目录结构为:

其中class1.php和class.php两文件在test\shop\member\article目录下。

截图如下:


从上面两图可以看出,命名空间配合__autoload在加载文件上的执行效率是普通__autoload加载文件方法的10倍以上,且内存消耗更低!
new.php代码如下:

<?php
    function __autoload($class)
    {
        $class = strtolower( $class ); 
        $class = str_replace( '\\', DIRECTORY_SEPARATOR, $class ); 
        require_once( dirname( __FILE__ ) . '/' . $class . '.php' ); 
 
    }
 
    use Shop\Member\Article as MyArticle;
 
    $start_time = xdebug_time_index();
    for ($i = 0; $i < 25000; $i++)
    {
        $class = new MyArticle\Class1();
    }
    $end_time =xdebug_time_index();
    echo '<b>Time usage:</b>',$end_time-$start_time, "<br/>";
    echo '<b>Max memory usage:</b>',xdebug_peak_memory_usage(),'<br/>';
    echo '<b>memory usage:</b>',xdebug_memory_usage(),'<br/>';
?>

old.php代码如下:

<?php
    $GLOBALS['MEMBER_CONFIGS'] = array(
        '20000' => 'member.page',
        '20001' => 'member.article',
    );
 
    $GLOBALS['MEMBER_CONFIGS_PATH_CONFIGS'] = array(
        '20000' => '/shop/member/includes/system',
        '20001' => '/shop/member/article',
 
    );
 
    function AutoLoadClass($class)
    {
        $arr = explode('.',$class);
        $class_name = end($arr);
        array_pop($arr);
        $class_path = implode('.',$arr);
        $mod_path = array_keys($GLOBALS['MEMBER_CONFIGS'],$class_path);
        if(!empty($mod_path))
        {
           $file_path = strtolower($GLOBALS['MEMBER_CONFIGS_PATH_CONFIGS'][$mod_path[0]]);
           require_once( dirname( __FILE__ )  . $file_path .DIRECTORY_SEPARATOR. $class_name.'.php' ); 
           $obj = new Class2();
        }
 
    }
 
    $start_time = xdebug_time_index();
    for ($i = 0; $i < 25000; $i++)
    {
        AutoLoadClass('member.article.class2');
    }
    $end_time =xdebug_time_index();
    echo '<b>Time usage:</b>',$end_time-$start_time, "<br/>";
    echo '<b>Max memory usage:</b>',xdebug_peak_memory_usage(),'<br/>';
    echo '<b>memory usage:</b>',xdebug_memory_usage(),'<br/>';
?>

class1.php代码如下:

<?php
    namespace Shop\Member\Article
    {
        class Class1
        {
            public function __construct()
            {
                //echo __CLASS__;
            }
        }
    }
?>

class2.php代码如下:

<?php
    class Class2
    {
        public function __construct()
        {
            //echo __CLASS__;
        }
    }
?>

发表我的评论