2012-02-18 145 views
3

我忽略了一些代码,这些代码是为了在产品页面上生成A-Z导航而编写的,而且它的做法是for循环;使用ascii octals 65-91和PHP的chr()函数。我想知道是否有更简单和/或更有效的方式来做这件事,我发现PHP的range()函数支持字母范围。PHP的范围('A','Z')是否返回一个静态数组?

后,我写我的测试代码比较不同的方法,有几个问题浮现在脑海:

  1. 不PHP店字母表中的静态数组?
  2. 如何更深入地查看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); 

?> 
+0

我不知道你,但我从来没有多余的2微秒担心我最少。这是我对PHP的主要问题:不是语言本身,而是那些坚持做无用的垃圾基准测试的大米。无论如何,一百万次迭代的东西不应该在循环中需要额外的2秒!哦,gn0! pfft – cHao 2012-02-18 01:33:04

+1

@cHao为自己说话。在我们的应用程序的主循环中额外增加了2微秒,我们还需要额外花费3000美元购买每个数据中心所需的硬件。如果它在内部循环中为2微秒,则花费更多。 – Crashworks 2012-02-18 01:52:04

+0

@Crashworks:如果这个小小的速度差异花了那么多钱,坦白地说,你不应该使用PHP。你可以使用C++(甚至是(C#)),它会节省数百万美元。当然,这里真正的优化(将创建同一阵列 - 我们刚刚使用的东西移出循环)是免费的。要点是,最快两者之间的速度差异可以忽略不计,通过改进算法可以更好地解决速度问题,而不是通过更快地创建阵列来解决。 – cHao 2012-02-18 06:37:11

回答

2

PHP浪费内存是否保留一组字母?我会怀疑它。 range()也可以处理各种值。

如果在这种情况下性能出现问题,您可能需要在循环之外声明该数组,以便可以重新使用该数组。然而,微型优化很少会带来巨大收益。使用大型应用程序进行分析以获得显着收益。

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

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

相关问题