PHP中strlen()函数的效率是多少?

6
使用strlen函数实际上是通过迭代字符串来计算字节数的,而不是简单地从索引返回字符串的长度值。我提出这个问题的原因是因为在编写速度敏感的脚本时,我可以选择存储预先计算好的非常长的字符串值,或者直接使用strlen函数并节省编程时间。但是,我想知道strlen如何工作,因为我经常依赖它,也许这不是一个好主意?请参见我的基准测试结果。

1
它是O(1) - 它不像C字符串那样是O(n)。 - user166390
1
我找不到任何证明它的文档,但我相当确定它是预先计算的。PHP字符串不像C字符串那样可修改。 - Barmar
PHP是开源的,您可以查看代码... - Barmar
@Barmar 可变性与此无关。Ruby字符串是可修改的,仍然具有离散长度。此外,并非所有有效的C字符串都指向可以修改的对象。 - user166390
mb_strlen() 是关于什么的? - NoSkill
1个回答

7

算了,我做了一个基准测试:

<?php
$shortstring='hello';

$longstring='long';
for($run=0;$run<100000;$run++)
    $longstring.='dsffghdgfhdsda'.rand(1000,2000);

$time=microtime(true);
for($run=0;$run<100000000;$run++)
    $temp=strlen($shortstring);
$time=microtime(true)-$time;

echo "strlen on short string took $time seconds\n";

$time=microtime(true);
for($run=0;$run<100000000;$run++)
    $temp2=strlen($longstring);
$time=microtime(true)-$time;

echo "strlen on long string took $time seconds\n";

结果

strlen on short string took 12.508891820908 seconds
strlen on long string took 11.897696971893 seconds

它显然不会遍历字符串而是返回一个预索引值。速度上没有区别。

对于像这样的基准测试,最好使短字符串和长字符串之间的差异大于20%。另外,变量名称不匹配。 - ElChupacabra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接