我在网站上做了一些分析,发现 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 -> 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
两者之间存在显着差异。当然,这总体上没什么大不了的,但我仍然感到困惑。
最佳答案
您运行的测试规模太小,数据太少。您永远不会获得一致的数据,因为其他系统因素(如 CPU 速度/负载)会造成更大的损失。
您的第一个测试是磁盘绑定(bind)的。降低(希望是合理的)短字符串的大小写基本上是瞬时的,或者至少以微秒为单位进行测量。点击磁盘以定位/加载/解析文件将花费毫秒级的时间。您正在尝试检测您不关心的部分所花费的时间是原来的 1000 倍的差异。即:strtolower 开销是一个舍入误差。
您的第二个测试虽然纯粹受 cpu/内存限制,但也太短而不实用。您不能确定进行 100 次字符串连接(以及相关的内存分配)不会压倒实际的小写。更好的测试是预先构建一系列混合大小写字符串(几百或几千个),然后重复遍历该数组并在 seuqnce 中 strtolower。这样您就可以消除尽可能多的开销/不相关的代码路径,并有望获得更一致的数据。
关于php - 为什么 PHP strtolower 的性能变化如此之大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3542917/