我读了一些(我想在编码错误),将字符串加在一起好像它们是数字是不好的做法,因为像数字一样,字符串不能改变.因此,将它们一起添加会创建一个新字符串.所以,我想知道,在关注性能时,将两个字符串组合在一起的最佳方法是什么?
这四种中哪一种更好,还是有另一种方式更好?
//Note that normally at least one of these two strings is variable $str1 = 'Hello '; $str2 = 'World!'; $output1 = $str1.$str2; //This is said to be bad $str1 = 'Hello '; $output2 = $str1.'World!'; //Also bad $str1 = 'Hello'; $str2 = 'World!'; $output3 = sprintf('%s %s', $str1, $str2); //Good? //This last one is probaply more common as: //$output = sprintf('%s %s', 'Hello', 'World!'); $str1 = 'Hello '; $str2 = '{a}World!'; $output4 = str_replace('{a}', $str1, $str2);
它甚至重要吗?
字符串与点连接绝对是三种方法中最快的一种.无论你喜欢与否,你总是会创建一个新的字符串.最有可能的最快方式是:
$str1 = "Hello"; $str1 .= " World";
不要将它们放入双引号中,$result = "$str1$str2";
因为这会为解析字符串中的符号产生额外的开销.
如果你打算将它用于带有echo的输出,那么使用echo的功能,你可以传递多个参数,因为这不会生成一个新的字符串:
$str1 = "Hello"; $str2 = " World"; echo $str1, $str2;
有关PHP如何处理插值字符串和字符串连接的更多信息,请查看Sarah Goleman的博客.
您总是要创建一个新的字符串,将两个或多个字符串连接在一起.这不一定是"坏",但它可能在某些情况下具有性能影响(如紧密循环中的数千/数百万个连接).我不是一个PHP人,所以我不能给你任何关于连接字符串的不同方法的语义的建议,但对于单个字符串连接(或只是一些),只是让它可读.你不会从低数量的人中看到性能受到打击.
这是快速而肮脏的测试代码,用于理解性能瓶颈.
$iterations = 1000000; $table = 'FOO'; $time = microtime(true); for ($i = 0; $i < $iterations; $i++) { $sql = sprintf('DELETE FROM `%s` WHERE `ID` = ?', $table); } echo 'single sprintf,',(microtime(true) - $time)."\n"; $time = microtime(true); for ($i = 0; $i < $iterations; $i++) { $sql = 'DELETE FROM `' . $table . '` WHERE `ID` = ?'; } echo 'single concat,',(microtime(true) - $time)."\n"; $time = microtime(true); for ($i = 0; $i < $iterations; $i++) { $sql = "DELETE FROM `$table` WHERE `ID` = ?"; } echo 'single "$str",',(microtime(true) - $time)."\n";
我得到这些结果:
single sprintf,0.66322994232178 single concat,0.18625092506409 <-- winner single "$str",0.19963216781616
$iterations = 1000000; $table = 'FOO'; $time = microtime(true); for ($i = 0; $i < $iterations; $i++) { $sql = sprintf('DELETE FROM `%s`,`%s`,`%s`,`%s`,`%s`,`%s`,`%s`,`%s`,`%s`,`%s` WHERE `ID` = ?', $table, $table, $table, $table, $table, $table, $table, $table, $table, $table); } echo 'many sprintf,',(microtime(true) - $time)."\n"; $time = microtime(true); for ($i = 0; $i < $iterations; $i++) { $sql = 'DELETE FROM `' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '` WHERE `ID` = ?'; } echo 'many concat,',(microtime(true) - $time)."\n"; $time = microtime(true); for ($i = 0; $i < $iterations; $i++) { $sql = "DELETE FROM `$table`,`$table`,`$table`,`$table`,`$table`,`$table`,`$table`,`$table`,`$table`,`$table` WHERE `ID` = ?"; } echo 'many "$str",',(microtime(true) - $time)."\n";
结果:
many sprintf,2.0778489112854 many concats,1.535336971283 many "$str",1.0247709751129 <-- winner
作为结论,很明显通过点(.)char的单个concat是最快的.对于案例,当你有很多concats时,表现最好的方法是通过"injection: $inject"
语法使用直接字符串注入.
除非真的有大量的文字,否则它确实无关紧要.