我忽略了一些代码,这些代码是为了在产品页面上生成A-Z导航而编写的,而且它的做法是for循环;使用ascii octals
65-91和PHP的chr()
函数。我想知道是否有更简单和/或更有效的方式来做这件事,我发现PHP的range()
函数支持字母范围。PHP的范围('A','Z')是否返回一个静态数组?
后,我写我的测试代码比较不同的方法,有几个问题浮现在脑海:
- 不PHP店字母表中的静态数组?
- 如何更深入地查看PHP层以下的内容以查看 发生了什么?
我有一个PHP脚本的cachegrind,除了环境配置之外,还可以根据需要连接它。对于那些谁可能想知道在它被执行的机器规格,这里有一些链接:
根@针线:〜$ lshw http://pastebin.com/cZZRjJcR
根@针线:〜$ 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);
?>
我不知道你,但我从来没有多余的2微秒担心我最少。这是我对PHP的主要问题:不是语言本身,而是那些坚持做无用的垃圾基准测试的大米。无论如何,一百万次迭代的东西不应该在循环中需要额外的2秒!哦,gn0! pfft – cHao 2012-02-18 01:33:04
@cHao为自己说话。在我们的应用程序的主循环中额外增加了2微秒,我们还需要额外花费3000美元购买每个数据中心所需的硬件。如果它在内部循环中为2微秒,则花费更多。 – Crashworks 2012-02-18 01:52:04
@Crashworks:如果这个小小的速度差异花了那么多钱,坦白地说,你不应该使用PHP。你可以使用C++(甚至是(C#)),它会节省数百万美元。当然,这里真正的优化(将创建同一阵列 - 我们刚刚使用的东西移出循环)是免费的。要点是,最快两者之间的速度差异可以忽略不计,通过改进算法可以更好地解决速度问题,而不是通过更快地创建阵列来解决。 – cHao 2012-02-18 06:37:11