为什么PHP strtolower性能如此变化?

时间:2010-08-22 19:08:12

标签: php performance

我在一个网站上做了一些分析,发现strtolower调用花了很长时间。

上下文是


function __autoload($class_name) {  
  require_once('app/model/' . strtolower($class_name) . '.php');  
}

结果是 _0.0092 - > ___ autoload()C:\ xxx \ config.php:0_
0.0093 - > strtolower()C:\ xxx \ config.php:77
0.0101 - > require-once(C:\ xxx.php)C:\ xxx \ config.php:77
我在跟踪文件中的几个地方看到了这个。

然后,我在以下上下文中尝试了该功能


for($i=0;$i<100;$i++) {  
  strtolower('SomeStRIng' . $i)  
}

结果是 0.0026 - &gt; strtolower()C:\ xxx \ index.php:53
0.0027 - &gt; strtolower()C:\ xxx \ index.php:53
0.0027 - &gt; strtolower()C:\ xxx \ index.php:53
0.0027 - &gt; strtolower()C:\ xxx \ index.php:53

两者之间存在显着差异。当然,这并不是什么大事,但我仍然感到困惑。

2 个答案:

答案 0 :(得分:5)

对于太少的数据,你运行的测试太小了。您将永远无法获得一致的数据,因为其他系统因素(如CPU速度/负载)将会带来更大的损失。

您的第一个测试是磁盘绑定的。降低(希望合理地)短串的情况基本上是瞬时的,或者至少以微秒为单位测量。点击磁盘来定位/加载/解析文件将采用毫秒级。你试图发现你不关心的部分需要花费1000倍的东西的差异。即:strtolower开销是一个舍入错误。

你的第二次测试,虽然纯粹是cpu / memory绑定,但也太短,不实用。您不能确定执行100个字符串连接(以及相关的内存分配)不会压倒实际的小写。一个更好的测试是预先构建一系列混合大小写字符串(几百或几千个),然后重复循环遍历该数组并在seuqnce中进行strtolower。这样你就可以消除尽可能多的开销/不相关代码路径,并且希望能够获得更加一致的数据。

答案 1 :(得分:0)

您使用的是哪个分析器?的XDebug?

我怀疑这是分析器的一个问题,因为你显示了非常显着的差异。看看这个配置文件是否有任何不同......

function __autoload($class_name) {  
  $file=strtolower($class_name);
  require_once('app/model/' . $file . '.php');  
}