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

And*_*ers 4 php performance

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

背景是


function __autoload($class_name) {  
  require_once('app/model/' . strtolower($class_name) . '.php');  
}
Run Code Online (Sandbox Code Playgroud)

结果是
_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)  
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*c B 5

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

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

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