PHP的范围('A','Z')是否返回静态数组?

时间:2012-02-18 01:18:59

标签: php performance profiling

我忽略了一些我在产品页面上生成A-Z导航的代码,完成它的方法是for循环;使用ascii octals 65-91和PHP的chr()函数。我想知道是否有更简单和/或更有效的方法,我发现PHP的range()函数支持字母范围。

在我编写测试代码以比较不同方法之后,我想到了一些问题:

  1. PHP是否存储字母表的静态数组?
  2. 如何更深入地剖析PHP层下面的内容 发生了什么事?
  3. 除了环境配置之外,我还有一个可以附加的PHP脚本的cachegrind。对于那些可能想知道执行它的机器规格的人,这里有一些链接:

    root @ workbox:〜$ lshw http://pastebin.com/cZZRjJcR

    root @workbox:〜$ sysinfo http://pastebin.com/ihQkkPAJ

    <?php
    /*
     * determine which method out of 3 for returning
     * an array of uppercase alphabetic characters 
     * has the highest performance
     * 
     * +++++++++++++++++++++++++++++++++++++++++++++
     * 
     * 1) Array $alpha = for($x = 65; $x < 91; $x++) { $upperChr[] = chr($x); }
     * 2) Array $alpha = range(chr(65), chr(90);
     * 3) Array $alpha = range('A', 'Z');
     * 
     * +++++++++++++++++++++++++++++++++++++++++++++
     * 
     * test runs with iterations:
     * 
     * 10,000:
     * - 1) upperChrElapsed: 0.453785s
     * - 2) upperRangeChrElapsed: 0.069262s
     * - 3) upperRangeAZElapsed: 0.046110s
     * 
     * 100,000:
     * - 1) upperChrElapsed: 0.729015s
     * - 2) upperRangeChrElapsed: 0.078652s
     * - 3) upperRangeAZElapsed: 0.052071s
     * 
     * 1,000,000:
     * - 1) upperChrElapsed: 50.942950s
     * - 2) upperRangeChrElapsed: 10.091785s
     * - 3) upperRangeAZElapsed: 8.073058s
     */
    
    ini_set('max_execution_time', 0);
    ini_set('memory_limit', 0);
    
    define('ITERATIONS', 1000000); // 1m loops x3
    
    $upperChrStart = microtime(true);
    for($i = 0; $i <= ITERATIONS; $i++) {
        $upperChr = array();
        for($x = 65; $x < 91; $x++) {
                $upperChr[] = chr($x);
        }
    }
    $upperChrElapsed = microtime(true) - $upperChrStart;
    
    // +++++++++++++++++++++++++++++++++++++++++++++
    
    $upperRangeChrStart = microtime(true);
    for($i = 0; $i <= ITERATIONS; $i++) {
        $upperRangeChr = range(chr(65), chr(90));   
    }
    $upperRangeChrElapsed = microtime(true) - $upperRangeChrStart;
    
    // +++++++++++++++++++++++++++++++++++++++++++++
    
    $upperRangeAZStart = microtime(true);
    for($i = 0; $i <= ITERATIONS; $i++) {
        $upperRangeAZ = range('A', 'Z');    
    }
    $upperRangeAZElapsed = microtime(true) - $upperRangeAZStart;
    
    printf("upperChrElapsed: %f\n", $upperChrElapsed);
    printf("upperRangeChrElapsed: %f\n", $upperRangeChrElapsed);
    printf("upperRangeAZElapsed: %f\n", $upperRangeAZElapsed);
    
    ?>
    

1 个答案:

答案 0 :(得分:2)

PHP会浪费内存来保存一组字母吗?我会怀疑的。 range()也适用于各种各样的值。

如果在这种情况下性能是一个问题,您可能希望在循环外部声明该数组,以便可以重复使用它。然而,很大的收益很少来自微观优化。在较大的应用程序上使用分析以获得显着的收益。

对于较低级别的分析,您可以在PHP CLI上使用valgrind。我也看到它用于apache进程。

相关:How to profile my C++ application on linux