• PHP归档phar性能測试


    PHP自从5.3后新增PHAR归档,Phar 归档的概念来自 Java™ 技术的 JAR 归档,它同意使用单个文件打包应用程序。这个文件里包括运行应用程序所需的全部东西。该文件不同于单个可运行文件,后者通常由编程语言生成,比方 C。由于该文件实际上是一个归档文件而非编译过的应用程序。因此 JAR 文件实际上包括组成应用程序的文件。可是考虑到安全性,不正确这些文件进行细致区分。Phar 扩展正是基于相似的理念。可是在设计时主要针对 PHP 的 Web 环境。

    相同,与 JAR 归档不同的是。Phar 归档可由 PHP 本身处理,因此不须要使用额外的工具来创建或使用。Phar 扩展对 PHP 来说并非一个新奇的概念。它最初使用 PHP 编写并被命名为 PHP_Archive。然后在 2005 年被加入到 PEAR 库。

    然而在实际中,解决这一问题的纯 PHP 解决方式非常缓慢。因此 2007 年又一次编写为纯 C 语言扩展,同一时候加入了使用 SPL 的 ArrayAccess 对象遍历 Phar 归档的支持。自那时起,人们做了大量工作来改善 Phar 归档的性能,眼下对Phar使用非常有限。而关于Phar的性能測试非常少,究竟Phar性能怎样,通过一个简单实验检验下。



    測试环境:
    PHP:5.5.10
    CPU:2GHz intel core i7
    Mem:8GB
    系统:Darwin 13.1.0

    主要測试点:
    1:Phar载入速度
    1.1:文件大小多少的影响?
    1.2:  include/require的影响?
    1.3:Phar 存根(Stub)内容的影响?
    2:Phar代码运行速度
    2.1 全局函数对照
    2.2 类对象
    2.3 类方法
    为了保证尽量保证測试准确。每种方式运行3次,去3次的平均值。

    同一时候作为对照,我们会直接採用代码方式,获得基准数据。
    Phar 文件主要包括文件


    phar-builder.php用于生成phar文件。运行test命令前,先运行此文件生成phar-test.phar文件。
    test_load.php 測试载入phar文件速度
    src文件夹内包括文件index.php文件是存根文件。包括dates.php,for.php,functions.php,dates測试文件类方法,for.php測试对象方法。functions.php測试函数方法。
    详细附件代码。
    第一:phar载入速度,採用include和require方式測试发现差异不大。仅仅採用require方式。


    $stime = microtime(true);
    require './phar-test.phar';
    $etime = microtime(true);
    $total = $etime - $stime;
    echo "phar total:".$total."s";
    运行后,效率例如以下
    localhost:phar ugg$ php test_phar_load.php 
    phar total:0.0044760704040527s
    localhost:phar ugg$ php test_phar_load.php 
    phar total:0.0051448345184326s
    localhost:phar ugg$ php test_phar_load.php 
    phar total:0.0043849945068359s
    localhost:phar ugg$ vim test_phar_load.php

    平均载入4.7毫秒

    对照直接源码引用方式。


    $stime = microtime(true);
    require './src/index.php';
    $etime = microtime(true);
    $total = $etime - $stime;
    echo "src total:".$total."s
    ";

    运行后,效率例如以下

    localhost:phar ugg$ php test_src_load.phpsrc 
    total:0.0026230812072754s
    localhost:phar ugg$ php test_src_load.phpsrc 
    total:0.0026969909667969s
    localhost:phar ugg$ php test_src_load.phpsrc 
    total:0.0025439262390137s

    平均载入2.6毫秒
    结论:通过载入速度对照。phar载入方式比直接文件载入方式慢了不少。差点儿直接引用文件所耗时间的两倍。同一时候我又在phar文件里载入一些干扰文件,使phar文件变大。发如今10k以内,这个load时间变化不大。

    当然我并没有把新增的文件放到存根内,这样做的目的,对于超过10K的文件夹。文件组织方式比方是autoload方式,而不会通过一个文件包括全部的文件。phar载入时间是src直接载入的1.8倍左右。

    第二:运行速度检验
    phar方式,代码例如以下

        $stime = microtime(true);
        //require 'phar://phar-test.phar';
        require 'phar-test.phar';
        $sstime = microtime(true);
        for($i = 0; $i<10000; ++$i){
            $date = dates::next_week();
            $for = new fortest();
            $i = $for->for1to10000();
            $number = number2Chinese('12345');
        }   
        $eetime = microtime(true);
        $etime = microtime(true);
        $total = $etime - $stime;
        $total2 = $eetime - $sstime;
        echo "phar load total:".$total."s
    ";
        echo "phar execution 10000 total:".$total2."s";
    运行效率例如以下
    localhost:phar ugg$ php test_phar_functions.php 
    phar load total:0.0047600269317627s
    phar execution 10000 total:0.00017499923706055s
    localhost:phar ugg$ php test_phar_functions.php 
    phar load total:0.004863977432251s
    phar execution 10000 total:0.00017404556274414s
    localhost:phar ugg$ php test_phar_functions.php 
    phar load total:0.004680871963501s
    phar execution 10000 total:0.00016689300537109s
    运行10000次的类方法,对象实例和对象方法,以及函数方法,总共时间消耗为0.17毫秒。
    src运行效率
    localhost:phar ugg$ php test_src_functions.php 
    phar load total:0.0029089450836182s
    phar execution 10000 total:0.00019693374633789s
    localhost:phar ugg$ php test_src_functions.php 
    phar load total:0.0028579235076904s
    phar execution 10000 total:0.0002140998840332s
    localhost:phar ugg$ php test_src_functions.php 
    phar load total:0.0029168128967285s
    phar execution 10000 total:0.00019478797912598s
    运行10000次的类方法,对象实例和对象方法,以及函数方法,总共时间消耗为0.20毫秒。


    小结:通过运行速度对照。发现是phar方式,运行速度。要比直接文件include方式,快了(0.20-0.17)/0.20*100=15%,phar方式运行速度快的详细原因没有找到。网上有份资料,apc+include_path设置 phar运行速度非常快。

    https://github.com/ralphschindler/test-phar-performance-apc/。

    总结:PHP归档phar方式,载入速度要慢于正常文件包括方式。可是运行速度要高于文件包括方式。假设配合include_path设置和APC或者OP方式。优化phar归档的载入速度。就能提升php的运行速度。下一步会做方面的尝试,1:构建大phar文件,实验载入速度,运行速度。2:了解phar载入原理和运行原理,3:包概念管理和依赖。


    其它一些參考资料
    PHP V5.3中新特性,创建并使用Phar归档。http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new4/
    test-phar-performance-apc https://github.com/ralphschindler/test-phar-performance-apc/

  • 相关阅读:
    第07组 Alpha冲刺(2/4)
    第07组 Alpha冲刺(1/4)
    团队项目-需求分析报告
    团队项目-选题报告
    1381 硬币游戏
    1381 硬币游戏
    1347 旋转字符串
    1344 走格子
    1305 Pairwise Sum and Divide
    1384 全排列
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9968797.html
Copyright © 2020-2023  润新知