不用strlen 该怎么样算出一个PHP字符串的长度 求解答

walden 发布于 2012/03/05 21:33
阅读 1K+
收藏 0
PHP
不用strlen 该怎么样算出一个PHP字符串的长度 求解答
加载中
1
deleted
deleted

引用来自“simonXia”的答案

<?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好

while (isset($str{++$i}));

这个有bug,空字符窜会返回1,最好改成

while ( isset($str{$i}) && ++$i );

 

php生成字符窜的时候会把长度保存到str结构体的len字段上, 而php的strlen并不是遍历,只是取这个字段, 所以效率上绝对远远高过其他方式

 

0
deleted
deleted
遍历字符窜累加或者split_str后sizeof,至于性能,蛤蛤.......
0
SimonXia
SimonXia

<?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";
?>

walden
walden
@simonXia : 我只记得php 中也可以写成$str[$i]的形式
SimonXia
SimonXia
字符串的操作,就像c语言里面语言. c语言是[]表示取字符串的第几个字符,php里面是{}.
walden
walden
$str{++$i}这是什么写法?我怎么从来都没见过
0
SimonXia
SimonXia

引用来自“false”的答案

引用来自“simonXia”的答案

<?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好

while (isset($str{++$i}));

这个有bug,空字符窜会返回1,最好改成

while ( isset($str{$i}) && ++$i );

 

php生成字符窜的时候会把长度保存到str结构体的len字段上, 而php的strlen并不是遍历,只是取这个字段, 所以效率上绝对远远高过其他方式

 


0
xzpeng
xzpeng

引用来自“SimonXia”的答案

引用来自“false”的答案

引用来自“simonXia”的答案

<?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好

while (isset($str{++$i}));

这个有bug,空字符窜会返回1,最好改成

while ( isset($str{$i}) && ++$i );

 

php生成字符窜的时候会把长度保存到str结构体的len字段上, 而php的strlen并不是遍历,只是取这个字段, 所以效率上绝对远远高过其他方式

 


首先, strlen() 是函数,而 isset() 是一种语言结构。

从源码上看, strlen()不做任何计算,只返回在 zval 结构中存储的一只字符串长度。函数调用会经过诸多步骤,如字母小写化、哈希查找。isset() 作为一种语言结构,意味着它的执行不需要字母小写化和哈希查找,也就是说,实际上在检验字符串长度的顶层代码中没花太多开销。

所以,在一些情况下,可以使用 isset() 代替 strlen() 来优化代码。

返回顶部
顶部