我忽略了一些代码,这些代码是我为在产品页面上生成A-Z导航而编写的,而执行此操作的方法是for循环;使用CCD_ 1 65-91和PHP的CCD_。我想知道是否有一种更简单和/或更有效的方法可以做到这一点,我发现PHP的range()
函数支持字母范围。
在我写了测试代码来比较不同的方法后,我想到了几个问题:
- PHP是否存储字母表的静态数组
- 我如何才能更深入地分析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++应用程序