PHP';s范围(';A';,';Z';)返回一个静态数组


Does PHP's range('A', 'Z') return a static array?

我忽略了一些代码,这些代码是我为在产品页面上生成A-Z导航而编写的,而执行此操作的方法是for循环;使用CCD_ 1 65-91和PHP的CCD_。我想知道是否有一种更简单和/或更有效的方法可以做到这一点,我发现PHP的range()函数支持字母范围。

在我写了测试代码来比较不同的方法后,我想到了几个问题:

  1. PHP是否存储字母表的静态数组
  2. 我如何才能更深入地分析PHP层下面的内容发生了什么事

我有一个PHP脚本的缓存,如果需要,除了环境配置之外,还可以附加它。对于那些可能想知道执行它的机器规格的人来说,这里有一些链接:

root@workbox:~$lshwhttp://pastebin.com/cZZRjJcR

root@workbox:~$系统信息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);
?>

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

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

至于较低级别的评测,您可以简单地在PHP CLI上使用valgrind。我还看到它在apache进程中使用过。

相关:如何在linux上评测我的C++应用程序