<?php
$str = "adfa我是0 大大大adf \
";
echo strlen($str),"\n";
while (isset($str{++$i})) {
}
echo $i;
?>
下面是时间测试,不知道为什么每次都是下面一种方法要耗时少,反而strlen耗时多呢?
<?php
$str = "adfa我是0 大大大adf \
";
$start1=microtime(true);
for($a=0;$a<100000;$a++){
strlen($str);
}
echo microtime(true)-$start1,"\n";
$start2=microtime(true);
for($a=0;$a<100000;$a++){
while (isset($str{++$i})) {
}
}
echo microtime(true)-$start2,"\n";
?>
第二个测试里循环内$i没初始化, 只是遍历了一次,其他次数全部都是判断一下就直接跳出了,所以导致2性能比1好
1
|
while
(isset(
$str
{++
$i
}));
|
这个有bug,空字符窜会返回1,最好改成
1
|
while
( isset(
$str
{
$i
}) && ++
$i
);
|
php生成字符窜的时候会把长度保存到str结构体的len字段上, 而php的strlen并不是遍历,只是取这个字段, 所以效率上绝对远远高过其他方式
首先, strlen() 是函数,而 isset() 是一种语言结构。
从源码上看, strlen()不做任何计算,只返回在 zval 结构中存储的一只字符串长度。函数调用会经过诸多步骤,如字母小写化、哈希查找。isset() 作为一种语言结构,意味着它的执行不需要字母小写化和哈希查找,也就是说,实际上在检验字符串长度的顶层代码中没花太多开销。
所以,在一些情况下,可以使用 isset() 代替 strlen() 来优化代码。