php字符串串联,性能

在Java和C#之类的语言中,字符串是不可变的,并且一次建立一个字符的字符串在计算上是昂贵的。在上述语言中,有一些库类可以降低这种成本,例如C#System.Text.StringBuilder和Java java.lang.StringBuilder。


php(4或5;我对两者都感兴趣)是否都共享此限制?如果是这样,是否有类似的解决方案?


翻翻过去那场雪
浏览 414回答 3
3回答

慕码人8056858

不,在PHP中没有stringbuilder类的类型,因为字符串是可变的。话虽如此,根据您在做什么,有不同的方式来构建字符串。例如,echo将接受逗号分隔的标记以进行输出。// This...echo 'one', 'two';// Is the same as thisecho 'one';echo 'two';这意味着您无需实际使用连接就可以输出复杂的字符串,这会比较慢// This...echo 'one', 'two';// Is faster than this...echo 'one' . 'two';如果需要在变量中捕获此输出,则可以使用输出缓冲功能来完成。另外,PHP的数组性能非常好。如果要执行逗号分隔的值列表之类的操作,请使用implode()$values = array( 'one', 'two', 'three' );$valueList = implode( ', ', $values );最后,请确保您熟悉PHP的字符串类型,它的不同定界符以及每个定界符的含义。

慕少森

PHP中不需要StringBuilder模拟。我做了几个简单的测试:在PHP中:$iterations = 10000;$stringToAppend = 'TESTSTR';$timer = new Timer(); // based on microtime()$s = '';for($i = 0; $i < $iterations; $i++){&nbsp; &nbsp; $s .= ($i . $stringToAppend);}$timer->VarDumpCurrentTimerValue();$timer->Restart();// Used purlogic's implementation.// I tried other implementations, but they are not faster$sb = new StringBuilder();&nbsp;for($i = 0; $i < $iterations; $i++){&nbsp; &nbsp; $sb->append($i);&nbsp; &nbsp; $sb->append($stringToAppend);}$ss = $sb->toString();$timer->VarDumpCurrentTimerValue();在C#(.NET 4.0)中:const int iterations = 10000;const string stringToAppend = "TESTSTR";string s = "";var timer = new Timer(); // based on StopWatchfor(int i = 0; i < iterations; i++){&nbsp; &nbsp; s += (i + stringToAppend);}timer.ShowCurrentTimerValue();timer.Restart();var sb = new StringBuilder();for(int i = 0; i < iterations; i++){&nbsp; &nbsp; sb.Append(i);&nbsp; &nbsp; sb.Append(stringToAppend);}string ss = sb.ToString();timer.ShowCurrentTimerValue();结果:10000次迭代:1)PHP,普通串联:〜6ms2)PHP,使用StringBuilder:〜5 ms 3)C#,普通串联:〜520ms4)C#,使用StringBuilder:〜1ms100000次迭代:1)PHP,普通串联:〜63ms2)PHP,使用StringBuilder:〜555ms3)C#,普通串联:〜91000ms // !!!4)C#,使用StringBuilder:〜17ms
打开App,查看更多内容
随时随地看视频慕课网APP