我在一个网站上做了一些分析,发现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
两者之间存在显着差异。当然,这并不是什么大事,但我仍然感到困惑。
答案 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');
}